如何访问特定的请求参数

时间:2013-09-29 02:37:35

标签: node.js twilio

我认为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);

1 个答案:

答案 0 :(得分:2)

正如我在你的类似问题中回答的那样,你必须等待整个回复才能对它做任何事情。当您从请求流中接收数据时:

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

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

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

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