nodejs微信公众号开发,无法自动回复消息的问题

能拿到用户发送给公众号的消息,但通过res.end()发送回复的xml数据时失败,即用户无法收到后台回复的消息。公众号显示出现故障。如果将代码中的res.setHeader一行注释取消,会出现 Can't set headers after they are sent.的错误?

req.on('end', function(){
    util.parseXMLAsync(postData)
    .then(result => {
        console.log(result)
        var now = new Date().getTime()
        if(result.MsgType === 'event'){
            if(result.Event === 'subscribe'){
                result.Content = '终于等到你的订阅~'
            }
        }
        // res.setHeader('Content-Type', 'text/xml')
        var response = `<xml>
                        <ToUserName>< ![CDATA[${result.FromUserName}] ]></ToUserName>
                        <FromUserName>< ![CDATA[${result.ToUserName}] ]></FromUserName>
                        <CreateTime>${now}</CreateTime>
                        <MsgType>< ![CDATA[text] ]></MsgType>
                        <Content>< ![CDATA[${result.Content}] ]></Content>
                    </xml>`
        res.end(response)
    })
})

result将接收到的xml转为json后的结果

阅读 3k
3 个回答

感谢各位的回答,问题已经解决。
这个问题实际上是由于response这个xml字符串中含有空格,就是< !] ],把这些空格全部去除掉可以正常回复。
然而这个xml字符串是从官方文档中拷贝下来的,也就是说官方文档中的xml字符串是含有空格的。
再关于res.end(response)这个问题,实际上已经把xml字符串发送给微信服务器了,但由于存在空格,微信服务器认为这不是一个正确的回复,所以会出错。

老生常谈的问题,node异步编程,修改header请使用writeheader

关于上一个回答里说的要用writeHead,我这样试过,并没遇到问题

const http = require('http');

let server = http.createServer(function (req, res) {
    let result = {
        FromUserName: 'weixin',
        ToUserName: 'segment',
        Content: 'xxxx'
    }, now = Date.now();

    res.setHeader('Content-Type', 'text/xml')
    var response = `<xml>
            <ToUserName><![CDATA[${result.FromUserName}]]></ToUserName>
            <FromUserName><![CDATA[${result.ToUserName}]]></FromUserName>
            <CreateTime>${now}</CreateTime>
            <MsgType><![CDATA[text]]></MsgType>
            <Content><![CDATA[${result.Content}]]></Content>
        </xml>`
    res.end(response)
}).listen(3001);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题