我们正在使用node.js向客户发送短信,并且最近添加了状态回调以记录已发送和已发送的状态。我们现在看到Twilio日志中有大量11200个错误,这些错误显然是成功的。查看调试器,我在响应正文中看到了这一点:
Twilio无法从以下位置获取内容: https://api.mycompany.com:443/api/1.0/sms/response错误:错误 阅读回复:回复不包含内容类型
并且消息文本包含:
消息"对StatusCallback URL的请求未成功。" httpResponse" 502"
在我们这边,/api/1.0/sms/response的处理程序将MessageSid与响应一起发送,将其与数据库中的一个匹配,然后查看MessageStatus。对于"发送"它将当前时间记录在已发送字段中,并将其保存回数据库,同样用于交付。最后,它只是执行一个res.end(),如node.js example。
所示以下是代码:
app.post('/api/1.0/sms/response', function(req, res) {
var post_id = req.body.MessageSid || "";
var status = req.body.MessageStatus || "";
var item = Item.create(globals);
if (post_id === "") {
globals.logger.error(moduleName, "POST sms/response", "Missing MessageSid: " + JSON.stringify(req.body), true);
res.end();
return;
}
item.loadFromPostId(post_id).then(function() {
if (status.toLowerCase() === "sent") {
item.sent = new Date();
}
else if (status.toLowerCase() === "delivered") {
item.delivered = new Date();
}
item.save().then(function() {
res.end();
});
});
});
看看几个错误,他们是Twilio试图发送"交付"我们的地位。从这些错误中检查我们的数据库中的MessageSids,匹配项在"已交付"中有一个时间戳。列,所以它一直通过代码保存。
对于此端点,我们的nginx日志(我们在节点前面使用)中只有200个响应,没有上游超时,也没有502。所以我不知道这个错误来自何处,或者如何摆脱它。
是的,我们应该处理未交付的等等,但这只是获得一些回复的快速通过。
答案 0 :(得分:2)
您应使用HTTP状态代码204进行响应:
res.status(204).end();
204状态仍然是成功的,例如200,但是特别意味着您没有发回任何内容(https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html)。 请注意,以下内容也可以使用,不需要end():
res.sendStatus(204);
答案 1 :(得分:1)
Twilio开发者传道者在这里。
首先,你没有什么可担心的。正如你所说,你正在收到回调并做你需要的事情。您可能希望在Twilio控制台中停止调试器图标闪烁。
从我所看到的情况来看,这是您链接到的Node.js示例的一个小疏忽。
只需拨打res.end()
即可关闭该流。似乎如果没有设置其他内容,这意味着响应将获得200的状态代码并且没有正文。虽然Twilio并不期望对这样的回调做出回应,但似乎仍然想知道发生了什么。
错误消息表明响应没有内容类型。您可以通过在致电res.set('Content-Type', 'text/plain')
之前调用res.end()
来设置响应的内容类型来解决此问题,这似乎取悦了Twilio HTTP客户端。
或者,您可以使用快速响应方法sendStatus
在一次调用中设置响应的状态和内容类型。只需拨打res.sendStatus(200)
,响应将设置为text/plain
,状态将为200,并且会有一个" OK"的正文。 Twilio HTTP客户端很乐意接受所有这些。
我建议您将对res.end()
的通话更改为res.sendStatus(200)
,我也会在Node.js示例中修复此问题。