Twiml POST 请求中的空参数

Empty params on Twiml POST request

一点背景。我有一个网络应用程序 运行 正在尝试接收来自 Twilio 的传入文本。我已将 Twilio 的短信 twiml url 配置为指向我的应用程序中的一条路线:

http://my-app-name.com/api/twiml

我在发出请求后执行了一些代码:

if (Meteor.server) {
    // use picker to make a server side route
    Picker.route('/api/twiml', (params, req, res, next) => {
        console.log(util.inspect(params, {showHidden: true, colors: true}));
        console.log(util.inspect(req.body, {showHidden: true, colors: true}));

        // message data (not populating?)
        let messageSid = params.query.MessageSid,
            accountSid = params.query.AccountSid,
            from = params.query.From,
            to = params.query.To,
            body = params.query.Body;

        //console.log(messageSid + '\n' + accountSid + '\n' + from + '\n' + to + '\n' + body)

        //from = '+' + from.trim();
        //to = '+' + to.trim();

        let responseBody = 'Thanks';

        res.writeHeader(200, {'Content-Type': 'application/xml'});

        return '<?xml version="1.0" encoding="UTF-8"?><Response><Sms from="[TWILIOFROM]" to="[TO]">[BODY]</Sms></Response>'
            .replace('[TWILIOFROM]', myNumber)
            .replace('[TO]', from)
            .replace('[BODY]', responseBody);
    });
}

当我向我的 twilio 号码发送短信时,代码运行,但我的 Twilio 日志中出现 11200 HTTP retrieval failure 错误。我的应用程序的日志正在输出第一个 console.log,但我没有收到来自 params.query 的任何数据。

{ query: {} }

第二个console.log:console.log(util.inspect(req.body, {showHidden: true, colors: true}));吐出一些垃圾:[90mundefined[39m

我是否应该放弃参数并尝试解析请求体?

我对 REST api 很陌生,所以我确定我缺少一些非常基本的东西。

这里是 Twilio 开发人员布道者。

当 Twilio POST 到您配置的 SMS url 时,parameters are sent as the body of the request 不作为查询字符串参数。

我对Picker不太熟悉,但是documentation suggests you can use Express middleware,包括body-parser。如果您将 Picker 与 body-parser 挂钩,那么您应该能够从 req.body 获取参数。这样的事情可能会起作用(注意第 2 行和第 3 行,包括 body-parser):

if (Meteor.server) {
    var bodyParser = Meteor.npmRequire( 'body-parser');
    Picker.middleware( bodyParser.urlencoded( { extended: false } ) );

    // use picker to make a server side route
    Picker.route('/api/twiml', (params, req, res, next) => {
        console.log(util.inspect(params, {showHidden: true, colors: true}));
        console.log(util.inspect(req.body, {showHidden: true, colors: true}));

        // message data (not populating?)
        let messageSid = req.body.MessageSid,
            accountSid = req.body.AccountSid,
            from = req.body.From,
            to = req.body.To,
            body = req.body.Body;

        //console.log(messageSid + '\n' + accountSid + '\n' + from + '\n' + to + '\n' + body)

        //from = '+' + from.trim();
        //to = '+' + to.trim();

        let responseBody = 'Thanks';

        res.writeHeader(200, {'Content-Type': 'application/xml'});

        let twiml =  '<?xml version="1.0" encoding="UTF-8"?><Response><Sms from="[TWILIOFROM]" to="[TO]">[BODY]</Sms></Response>'
            .replace('[TWILIOFROM]', myNumber)
            .replace('[TO]', from)
            .replace('[BODY]', responseBody);

        res.end(twiml);
    });
}

如果这有帮助,请告诉我。

编辑:我认为,您实际上需要使用 res.send 将其发送到响应对象,而不是返回 TwiML。我已经更新了上面的代码。