type未定义
来源:4-4 第四天 上传临时素材之图片和视频
莫大帅逼
2016-10-05
老师 这里弄了很久还是不知道哪里错了 请老师帮我看一下吧
这是 wechat。js的代码
'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()
}
Wechat.prototype.fetchAccessToken =function (data) {
var that = this
if(this.access_token && this.expires_in){
if(this.isValidAccessToken(this)){
return Promise.resolve(this)
}
}
this.getAccessToken()
.then(function (data) {
try{
data=JSON.parse(data)
}
catch (e){
return that.updateAccessToken(data)
}
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)
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 Date().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.body; /*var data =response[1];*/
var now =(new Date().getTime());
var expires_in =now +(data.expires_in-20)*1000;
data.expires_in =expires_in;
resolve(data)
})
})
}
Wechat.prototype.uploadMaterial =function (type,filepath) {
var that =this
var form ={
media:fs.createReadStream(filepath)
}
return new Promise(function (resolve,reject) {
that
.fetchAccessToken()
.then(function (data) {
var url= api.upload + 'access_token=' + data.access_token + '&type' + type
request({method: 'POST',url:url,formData:form,json:true}).then(function (response) {
var _data =response.body; /*var data =response[1];*/
if(_data){
resolve(_data)
}else {
throw new Error('upload material falis')
}
})
.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
6回答
-
Scott
2016-10-05
往上面逐步追溯代码就能看出来,access_token 是无效的,说明一开始获取的 token 要么是无效的,要么是过期了更新失败,导致你上传后拿到的 data.media_id 就是不合法的值,所以是 token 这里就出错了,在 token 获取和更新这块,可以尝试多加些 console 看看请求的 url 以及返回的 response.body 和 data 是不是都处理正确了,找到答案的方法比结果重要
032016-10-06 -
Scott
2016-10-05
把原来的 access_token 从 txt 文件里删掉,重启一下服务试试
012016-10-05 -
Scott
2016-10-05
把 Wechat.prototype.fetchAccessToken 里面的
this.getAccessToken()
前面加上 return 试试
012016-10-05 -
莫大帅逼
提问者
2016-10-06
这是微信入口文件的代码
这是博客入口文件的代码
00 -
莫大帅逼
提问者
2016-10-05
老师 你看看
00 -
莫大帅逼
提问者
2016-10-05
老师 我按照你说的 改了 我顺便打印了一下data 他出现了40001 是怎么回事?
00
相似问题
回答 1
回答 1