Twilio 11200错误的短信状态回调

时间:2018-03-14 23:18:07

标签: node.js sms twilio

我们正在使用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。所以我不知道这个错误来自何处,或者如何摆脱它。

是的,我们应该处理未交付的等等,但这只是获得一些回复的快速通过。

2 个答案:

答案 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示例中修复此问题。