uploadMaterial里的getAccessToken()把一切断了,后面的值什么的都无法传递,也无法运行

来源:4-4 第四天 上传临时素材之图片和视频

惟独爱衣

2017-11-03

'use strict'


var Promise = require('bluebird')

var request = Promise.promisify(require('request'))

var util = require('./util')

var fs = require('fs')

var prefix = 'https://api.weixin.qq.com/cgi-bin/'

var api = {

accessToken: prefix + 'token?grant_type=client_credential',

upload: prefix + 'media/upload?'

}


function Wechat(opts) {

var that = this

this.appID = opts.appID

this.appSecret = opts.appSecret

this.getAccessToken = opts.getAccessToken

this.saveAccessToken = opts.saveAccessToken


this.fetchAccessToken()

// this.getAccessToken()

// .then(function(data) {

// try {

// data = JSON.parse(data)

// } catch (e) {

// return that.updateAccessToken()

// }


// if (that.isValidAccessToken(data)) {

// return Promise.resolve(data)

// } else {

// return that.updateAccessToken()

// }


// })

// .then(function(data) {

// that.access_token = data.access_token

// that.expires_in = data.expires_in


// that.saveAccessToken(data)

// console.log(123123123213)

// })


}

Wechat.prototype.fetchAccessToken = function(data) {

var that = this

if (this.access_token && this.expires_in) {

if (this.isValidAccessToken(this)) {

return Promise.resolve(this)

}


}

console.log(123)

return that.getAccessToken()

.then(function(data) {


try {

data = JSON.parse(data)

} catch (e) {

return that.updateAccessToken()

}

if (that.isValidAccessToken(data)) {

return Promise.resolve(data)

} else {

return that.updateAccessToken()

}

console.log(data)

})

.then(function(data) {


that.access_token = data.access_token

that.expires_in = data.expires_in


that.saveAccessToken(data)

return Promise.resolve(data)

})

}


Wechat.prototype.isValidAccessToken = function(data) {

if (!data || !data.access_token || !data.expires_in) {

return false

}


var access_token = data.access_token

var expires_in = data.expires_in

var now = (new Data().getTime())


if (now < expires_in) {

return true

} else {

return false

}

}


Wechat.prototype.updateAccessToken = function() {

var appID = this.appID

var appSecret = this.appSecret


var url = api.accessToken + '&appid=' + appID + '&secret=' + appSecret


return new Promise(function(resolve, reject) {

request({

url: url,

json: true

})

.then(function(response) {

var data = response

var now = (new Date().getTime())

var expires_in = now + (data.expires_in - 20) * 1000

data.expires_in = expires_in


// resolve(data)

return Promise.resolve(data)

})

})



}


Wechat.prototype.uploadMaterial = function(type, filepath) {

var that = this


var form = {

media: fs.createReadStream(filepath)

}

return new Promise(function(resolve, reject) {

return that

.fetchAccessToken()

.then(function(data) {

var url = api.upload + 'access_token=' + data.access_token + '&type=' + type

console.log(url)

request({

method: 'POST',

url: url,

formData: form,

json: true

})

.then(function(response) {

console.log(123)

var _data = response

if (_data) {

resolve(_data)

} else {

throw new Error('upload material fails')

}

})

.catch(function(err) {

reject(err)

})

})

})

}




Wechat.prototype.reply = function() {

var content = this.body

var message = this.weixin

var xml = util.tpl(content, message)


this.status = 200

this.type = 'application/xml'

this.body = xml

}


module.exports = Wechat


写回答

3回答

wubinking

2017-11-09

你这个问题解决了码,我也遇到这个问题,这个函数执行fetchAccessToken()返回的空的,应该是return Promise.resolve(data)这一行执行代码的问题,返回的全是undifend.

0
0

Scott

2017-11-05

检查下 request 返回的数据


.then(function(response) {


这里要拿到的应该是 response.body 或者是 response[1] (从前老版本的 request 这样获取)


然后,在每一个异步请求后,都打印下拿到的值,看看哪个地方有报错信息,根据这个报错来找问题

0
0

惟独爱衣

提问者

2017-11-03

uploadMaterial先找的fetchToken()然后fetchToken()找的getToken(),,就在此处断掉,,服务器也不报错,公众号过一会儿回复服务器无法响应

0
0

7天搞定Node.js微信公众号

Koa框架、ES2015新特性、MongoDB,开发微信公众号

1742 学习 · 787 问题

查看课程