求问老师:this.getAccessToken is not a function 错误

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

落叶无痕

2016-07-25

'use strict'
var Promise=require('bluebird')
var fs=require('fs')
var request=Promise.promisify(require('request'))
var xmlopr=require('./xmlopr')
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){
	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()
		}
		if(that.isValidAccessToken){
			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(data){
	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 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)
	}
	var appID=this.appID
	var appSecret=this.appSecret

   	return new Promise(function(resolve,reject){
   		that
   		.fetchAccessToken()
   		.then(function(data){
   			var url=api.accessToken+'&access_token='+data.access_token+'&type='+type	   			
	   		request({method:'POST',url:url,formData:form,json:true}).then(function(response){
	   		var _data=response.body
	   		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=xmlopr.tpl(content,message);
	this.status=200;
	this.type='application/xml';
	this.body=xml;

}
module.exports=Wechat;

报错,显示 this.getAccessToken is not a function 

写回答

2回答

Scott

2016-07-27

this.getAccessToken()

    .then(function(data){

的 this 前面需要加 return

0
1
落叶无痕
非常感谢!
2016-07-27
共1条回复

落叶无痕

提问者

2016-07-27

其实开始通过查看其他同学的提问,也加上去了,可是没有什么反应,后来换了一个端口正常了,不太清楚什么原因

0
0

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

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

1742 学习 · 787 问题

查看课程