Cannot read property 'type' of undefined

来源:4-3 第四天 自动回复各种消息

甫里

2016-06-16

http://szimg.mukewang.com/576278900001385b06340191.jpg

能够打印出取消关注 但是还是会报错Cannot read property 'type' of undefined

exports.tpl =function(content,message){
	var info = {};
	var type = 'text';
	var fromUserName = message.FromUserName
	var toUserName = message.ToUserName;

	if (Array.isArray(content)) {
		type = 'news'
	}
	console.log(content.type)
	type = content.type || type;
	info.content = content;
	info.msgType = type;
	info.createTime = new Date().getTime()
	info.toUserName = fromUserName;
	info.fromUserName =toUserName;

	return tpl.compiled(info)
}
//g.js
module.exports=function(opts,handler){
	var wechat= new Wechat(opts);
	
	return function* (next){
		
		var that = this;
		var Token = opts.Token;
		var signature = this.query.signature;
		var timestamp = this.query.timestamp;
		var nonce = this.query.nonce;	
		var echostr	=this.query.echostr;

		var str =[Token,timestamp,nonce].sort().join('');
		var sha=sha1(str);
		if (this.method === 'GET') {
			if (sha === signature) {
				this.body=echostr+'';
			}else{
				this.body='wrong!';
			}		
		}
		else if (this.method === 'POST') {
			if (sha !== signature) {
				return false;
			}
			var data = yield getRawBody(this.req,{
				length:this.length,
				limit: '1mb',
    			encoding: this.charset
			})
			var content = yield util.parseXMLAsync(data)
				
			var message = util.formatMessage(content.xml)
			
			this.weixin = message;

			yield handler.call(this,next);

			wechat.reply.call(this)
		}
	}
}
//util.js
'use strict'

var Promise=require('bluebird');
var  xml2js =require('xml2js');
var parser = new xml2js.Parser();
var tpl = require('./tpl')


exports.parseXMLAsync = function (xml) {
	return new Promise(function(resolve,reject){
		parser.parseString(xml,function(err,content){
			if (err) reject(err)
			else resolve(content) 
		})

	})
}
function formatMessage(result){
	var message = {};
	if (typeof result === 'object') {
		var keys = Object.keys(result);
		for(var i = 0; i<keys.length; i++){
			var item = result[keys[i]]
			var key = keys[i];
			if (!(item instanceof Array)||item.length ===0) {
				continue
			}
			if (item.length === 1) {
				var val = item[0];
				
				if (typeof val === 'object') {
					message[key] =formatMessage(val)
				}
				else{
					message[key]=(val || '').trim()
				}
			}
			else{
				message[key]=[];
				for (var j = 0, k =item.length; j<k; j++) {
					message[key].push(formatMessage(item[j]));
				}
			}
		}
	}
	return message
}
exports.formatMessage =formatMessage;
exports.tpl =function(content,message){
	var info = {};
	var type = 'text';
	var fromUserName = message.FromUserName
	var toUserName = message.ToUserName;

	if (Array.isArray(content)) {
		type = 'news'
	}
	console.log(content.type)
	type = content.type || type;
	info.content = content;
	info.msgType = type;
	info.createTime = new Date().getTime()
	info.toUserName = fromUserName;
	info.fromUserName =toUserName;
   
	return tpl.compiled(info)
}
//wechat.js
'use strict'

var Promise=require('bluebird');
var request=Promise.promisify(require('request'));
var prefix='https://api.weixin.qq.com/cgi-bin/';
var util = require('./util')
var api={
	accessToken:prefix+'token?grant_type=client_credential'
}


function Wechat(opts){
	var that = this;
	this.appID=opts.appID;
	this.appsecret=opts.appsecret;
	this.getAccessToken=opts.getAccessToken;
	this.saveAccessToken=opts.saveAccessToken;

	this.getAccessToken()
		.then(function(data){
			try{
				data=JSON.parse(data);
			}
			catch(e){
				return that.updataAccessToken()
			}
			if (that.isValidAccessToken(data)) {
				return Promise.resolve(data)
			}else{
				return that.updataAccessToken()
			}
		})
		.then(function(data){
			that.data=data.access_token;
			that.expires_in=data.expires_in;
			that.saveAccessToken(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.updataAccessToken = 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 now = (new Date().getTime())

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

Wechat.prototype.reply = function() {
	var content = this.body;
	var message = this.weixin;
	console.log(content);//undefined
	var xml = util.tpl(content,message);
	this.status = 200;
	this.type = 'application/xml';
	this.body = xml
};
module.exports=Wechat;


写回答

2回答

Scott

2016-06-17

yield handler.call(this,next); 这里的 next 应该是传入的 handler 吧

0
1
慕用2246375
啥意思?
2016-10-12
共1条回复

Scott

2016-06-16

把更多源代码贴一下,同时可以先把 content 也打印下,看看 content 是不是就是空的

0
3
qq_smile笑看花_0
回复
甫里
回复 甫里 请问,你的错误是出在哪个地方
2016-06-26
共3条回复

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

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

1742 学习 · 787 问题

查看课程