weixin.js中的上下文没有拿到

来源:

慕粉3173836

2016-04-18

报了这个错

http://szimg.mukewang.com/571468280001a2c005960351.jpg

就把g.js和weixin.js相关值打印出来打印出来

571469d00001494b04620142.jpg

http://szimg.mukewang.com/57146aaa0001514404670164.jpg

得到下面的结果:

http://szimg.mukewang.com/57146ac500016dac06110488.jpg

看了上一个同学的回答,变量应该没拼错吧.而且我也试过改成yield* handler.call(this, next),也是报同样的错,this上下文好像没有改变,附上代码,方便调试:

g.js

// 中间件
var sha1 = require("sha1")
// 帮助转化XML的模块
var getRawBody = require("raw-body")
var Wechat = require("./wechat")
var util = require("./util")
module.exports = function(opts,handler) {
    // 实例WeChat是处理票据检查,票据更新,opts 为appjs传入的config
    var wechat = new Wechat(opts)

    // 中间件是处理数据等等
    return function *(next) {
        // 请求参数this.query
        console.log(this.query)
        var that = this
        var token = opts.token
        var signature = this.query.signature
        var nonce = this.query.nonce
        var timestamp = this.query.timestamp
        var echostr = this.query.echostr
        // 给字典排序
        var str = [token, timestamp, nonce].sort().join("")
        // sha1加密
        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) {
                // 非微信请求
                this.body = "wrong"
                return false
            }
            // 处理微信请求的数据
            var data = yield getRawBody(this.req, {
                // buffer的配置项
                length: this.length,
                limit: "1mb",
                encoding: this.charset
            })
            // 解析XML
            var content = yield util.parseXMLAsync(data)
            console.log(content)
            // 对json的value值进行格式化
            var message = util.formatMessage(content.xml)
            console.log(message)
            // 将解析后的json挂载到this上,以便后边能拿到这个json
            this.weixin = message
            console.log("this.weixin = " + this.weixin)
            console.log("messagetype = " + this.weixin.MsgType)
            // 暂停这里,通过业务层处理返回变量,通过call来改变上下文
            yield handler.call(this, next)
            // 业务层处理完毕,返回这里
            wechat.reply.call(this)

            //if (message.MsgType === "event") {
            //    if (message.Event === "subscribe"){
            //        var now = new Date().getTime()
            //        // 设置回复消息
            //        that.status = 200
            //        that.type = "application/xml"
            //        // CDATA里的内容将不会当做XML来解析
            //        var reply = "<xml>"+
            //            "<ToUserName><![CDATA["+ message.FromUserName + "]]></ToUserName>" +
            //            "<FromUserName><![CDATA[" + message.ToUserName + "]]></FromUserName>" +
            //            "<CreateTime>" + now + "</CreateTime>" +
            //            "<MsgType><![CDATA[text]]></MsgType>"+
            //            "<Content><![CDATA[你好]]></Content>"+
            //            "</xml>"
            //        that.body = reply
            //        console.log(reply)
            //        return
            //    }
            //}
        }

    }
}

weixin.js

"use strict"
// 自动回复设置
exports.reply = function* (next) {
    var message = this.weixin

    console.log("微信的Messge : " + this.weixin)
    if (message.MsgType === "event") {
        if (message.Event === "subscribe") {
            if (message.EventKey) {
                console.log("扫二维码进来: " + message.EventKey + "  " + message.ticket)
            }
            this.body = "您关注了订阅号  消息ID:  "
        }
        else if (message.Event === "unsubscribe") {
            console.log("取消关注")
            this.body = ""
        }
        else  if (message.Event === "LOCATION") {
            this.body = "您上报的位置是:  " + message.latitude+ " / " + message.longitude + " - " + message.Precision
        }
        else  if (message.Event === "CLICK") {
            this.body = "您点击了菜单:  "+ message.EventKey
        }
        else if (message.Event === "SCAN") {
            console.log("关注后扫二维码" + message.EventKey + " " + message.Ticket)
            this.body = "看到你扫了一下哦"
        }
        else if (message.Event === "VIEW") {
            // 这里的eventkey是URL地址
            this.body = "您点击了菜单中的链接 :  " + message.EventKey
        }

    }
    else if (message.MsgType === "text") {
        var content = message.Content
        var reply = "额,你说的 " + message.Content + " 太复杂了"
    }

    yield next
}

------------------------------------------------------------分割线------------------------------------------------------------------

app.js

'use strict'

var Koa = require("Koa")
var path = require("path")
var wechat = require("./wechat/g")
var util = require("./libs/util")
var config = require("./config")
var weixin = require("./weixin")
var wechat_file = path.join(__dirname, "./config/wechat.txt")

var app = new Koa()
// 使用中间件
app.use(wechat(config.wechat, weixin.reply))

app.listen(3001)
console.log("listening: 3001")


写回答

1回答

Scott

2016-04-18

中间件的入口代码也贴一下吧

0
1
慕粉3173836
sorry老师,刚刚重新启动了,整个又跑通了,求忽视
2016-04-18
共1条回复

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

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

1742 学习 · 787 问题

查看课程