0

我认为 Twilio 请求参数的格式作为 JSON 序列化数据返回——根据响应回调部分列出的文档 ( http://twilio.github.io/twilio-node/#restResources )

如果是这种情况,我认为我可以使用 JSON.parse 访问请求参数(特别是文本的正文),如下所述......但是我没有得到任何类型的响应。

var http = require('http');
var twilio = require('twilio');

http.createServer(function (req, res) {

  var body = '';

  req.on('data', function(data) {
    var messageBody = JSON.parse(data);
    body += messageBody.body;
  });

  req.on('end', function() {
    //Create TwiML response
    var twiml = new twilio.TwimlResponse();

    twiml.message('Thanks, your message of "' + body + '" was received!');

    res.writeHead(200, {'Content-Type': 'text/xml'});
    res.end(twiml.toString());
    });

}).listen(8080);

在此之前,我曾尝试访问如下所示的参数......但正文始终返回“未定义”。

var http = require('http');
var twilio = require('twilio');

http.createServer(function (req, res) {

  var body = '';

  req.on('data', function(data) {
    body += data.body;
  });

  req.on('end', function() {
    //Create TwiML response
    var twiml = new twilio.TwimlResponse();

    twiml.message('Thanks, your message of "' + body + '" was received!');

    res.writeHead(200, {'Content-Type': 'text/xml'});
    res.end(twiml.toString());
    });

}).listen(8080);

如果我只是这样做,body += data;那么我会收到所有组合在一起的请求参数——我不需要这些参数。

想法?您能解释一下如何访问特定的请求参数吗?

** * ** * ***已更新* ** * ** * **在合并@hexacyanide 的建议后,我最终得到了以下有效的代码

var http = require('http');
var twilio = require('twilio');
var qs = require('querystring');

http.createServer(function (req, res) {

  var body = '';

  req.setEncoding('utf8');

  req.on('data', function(data) {
    body += data;
  });

  req.on('end', function() {
    var data = qs.parse(body);
    var twiml = new twilio.TwimlResponse();
    var jsonString = JSON.stringify(data);
    var jsonDataObject = JSON.parse(jsonString);
    twiml.message('Thanks, your message of ' + jsonDataObject.Body + ' was received!');
    res.writeHead(200, {'Content-Type': 'text/xml'});
    res.end(twiml.toString());
  });

}).listen(8080);
4

1 回答 1

2

正如我在您的类似问题中回答的那样,您必须等待整个响应才能对其进行任何操作。当您从请求流中接收数据时:

var buf = '';
req.setEncoding('utf8');
req.on('data', function(chunk) {
  buf += chunk;
});

您正在接收原始数据。它是未处理的字节,没有被解析,你不知道它代表了多少总数据(除非你检查过内容长度标题)。这也意味着您不能使用JSON.parse(),因为您将获得一块长度未知的数据,这些数据通常不代表整个 JSON 字符串(如果它只是括号,或者长度真的很短,等等)。

即使在接收特定的请求参数时,您也必须接收整个请求,并对其进行解析。bodyParser()为此目的创建了诸如来自流行模块 Express 的模块。如果您不想使用模块,只需收集请求并解析它:

var buf = '';
req.setEncoding('utf8');
req.on('data', function(chunk) {
  buf += chunk;
});
req.on('end', function() {
  var data = JSON.parse(buf);
});
于 2013-09-29T02:59:40.990 回答