能拿到用户发送给公众号的消息,但通过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后的结果
感谢各位的回答,问题已经解决。
这个问题实际上是由于
response
这个xml字符串中含有空格,就是< !
和] ]
,把这些空格全部去除掉可以正常回复。然而这个xml字符串是从官方文档中拷贝下来的,也就是说官方文档中的xml字符串是含有空格的。
再关于
res.end(response)
这个问题,实际上已经把xml字符串发送给微信服务器了,但由于存在空格,微信服务器认为这不是一个正确的回复,所以会出错。