【问题标题】:Twilio 11200 errors in sms status callback短信状态回调中的 Twilio 11200 错误
【发布时间】:2018-03-14 23:18:06
【问题描述】:

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

Twilio 无法从以下位置获取内容: https://api.mycompany.com:443/api/1.0/sms/response 错误:错误 读取响应:响应不包含内容类型

并且消息文本有:

Msg "对 StatusCallback URL 的请求不成功。" http响应“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 个响应,没有上游超时,也没有 502s。所以我不知道这个错误来自哪里,或者如何摆脱它。

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

【问题讨论】:

    标签: node.js sms twilio


    【解决方案1】:

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

    res.status(204).end();
    

    204 状态仍然是成功的,就像 200 一样,但具体意味着您没有发回任何内容 (https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html)。 请注意,以下内容也有效,并且不需要 end():

    res.sendStatus(204);
    

    【讨论】:

    • 终于回到了这个,这实际上是更好的解决方案,所以改变答案。如果您回复状态 200,您将收到与“OK”状态 200 相对应的另一条正在发送的文本的账单。如果您发送 204,则不会收取额外费用。
    • 抱歉,没有意识到您收到了 200 响应。我已经做了一个新的 PR 来再次纠正这个例子:github.com/TwilioDevEd/api-snippets/pull/738.
    • 啊,我没有重新阅读我自己的问题。我会坚持将状​​态回调上的 204 作为最佳选择,但额外费用不会出现在那儿,而是在传入的 sms webhook 上。这就是没有正文的 200 响应实际上将“OK”发送回发送文本的人,从而产生费用,但 204 没有。
    【解决方案2】:

    这里是 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 示例中解决这个问题。

    【讨论】:

    • 谢谢 - 今天早上修补了代码 - 到目前为止,我们已经发送了六个,并且没有 11200s,这是非常确定的,因为 100% 在补丁之前有警告。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多