短信状态回调中的 Twilio 11200 错误

Twilio 11200 errors in sms status callback

我们正在使用 node.js 向客户发送 SMS,并且最近添加了状态回调以记录已发送和已发送状态。我们现在还在 Twilio 日志中看到大量 11200 错误,这些错误显然是成功的。查看调试器,我在响应正文中看到了这一点:

Twilio was unable to fetch content from: https://api.mycompany.com:443/api/1.0/sms/response Error: Error reading response: Response does not contain content type

消息正文有:

Msg "Request to StatusCallback URL was unsuccessful." httpResponse "502"

在我们这边,/api/1.0/sms/response 的处理程序获取与响应一起发送的 MessageSid,将其与数据库中的一个匹配,然后查看 MessageStatus。对于 "sent",它将当前时间记录在已发送字段中并将其保存回数据库,对于已交付也是如此。最后,它只是执行 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 尝试向我们发送 "delivered" 状态时出现的。从这些错误中检查我们的数据库中的 MessageSids,匹配项在 "delivered" 列中有一个时间戳,因此它一直通过代码进行保存。

对于这个端点,我们的 nginx 日志(我们在节点前面使用)中只有 200 个响应,没有上游超时,也没有 502。所以我不知道这个错误是从哪里来的,或者如何摆脱它。

是的,我们应该处理未送达等问题,但这只是获得一些回复的快速传递。

此处为 Twilio 开发人员布道师。

首先,您无需担心。正如您所说,您正在接收回调并执行您需要的操作。不过,您可能希望停止在 Twilio 控制台中向您闪烁的调试器图标。

据我所知,这是对您链接到的 Node.js 示例的一个小疏忽。

只需调用 res.end() 即可关闭流。看起来如果没有设置任何其他内容,这意味着响应将获得状态代码 200 并且没有正文。虽然 Twilio 不期望对这样的回调做出响应,但它似乎仍然想知道发生了什么。

错误消息指出响应没有内容类型。您可以通过在调用 res.end() 之前调用 res.set('Content-Type', 'text/plain') 来设置响应的内容类型来解决此问题,这似乎取悦了 Twilio HTTP 客户端。

或者,您可以使用快速响应方法 sendStatus 在一次调用中设置响应的状态和内容类型。只需调用 res.sendStatus(200),响应将设置为 text/plain,状态将是 200,并且会有一个 "OK" 的正文。 Twilio HTTP 客户端将很乐意接受所有这些。

我建议您将对 res.end() 的调用更改为 res.sendStatus(200),我也会在 Node.js 示例中修复该问题。

您应该使用 HTTP 状态代码 204 进行响应:

res.status(204).end();

204 状态仍然是成功,如 200,但具体表示您没有发回任何内容 (https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html)。 请注意,以下内容也适用,并且不需要 end():

res.sendStatus(204);