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.
00 -
Scott
2017-11-05
检查下 request 返回的数据
.then(function(response) {
这里要拿到的应该是 response.body 或者是 response[1] (从前老版本的 request 这样获取)
然后,在每一个异步请求后,都打印下拿到的值,看看哪个地方有报错信息,根据这个报错来找问题
00 -
惟独爱衣
提问者
2017-11-03
uploadMaterial先找的fetchToken()然后fetchToken()找的getToken(),,就在此处断掉,,服务器也不报错,公众号过一会儿回复服务器无法响应
00
相似问题