Meteor - 从传入的HTTP请求中解析数据

时间:2013-12-05 00:08:22

标签: parsing http meteor iron-router

对于传出的HTTP请求(使用meteor.http.call),我可以定义参数和/或数据。然后可以得到结果(通过results.content)。

如何访问和解析传入HTTP请求的正文/内容/数据?

使用铁路由器,我已经达到了这个目的:

Router.map(function () {
this.route('httpTest', {
path: '/httpTest',
action: function () {
  var request = this.request;
  var response = this.response;      
  console.log('request_body: '+ request.body);
  // request.body does not work.  what should it be????

N.B。我知道我可以访问查询参数,但我想从传入的http请求的正文中访问表单数据和/或json数据。

3 个答案:

答案 0 :(得分:2)

请求是incoming http message,是Readable Stream,因此您可以通过从该流中读取来获取请求的数据。

以下内容应该有效(但我没有测试过):

var readable = this.request;
var alldata = "";
readable.on('data', function(chunk) {
  alldata += chunk;
})
readable.on('end', function() {
  console.log('do something with alldata');
});

答案 1 :(得分:1)

由于缺少where: 'server',它可能无法正常工作。这是一个有效的例子:

Router.map(function() {
  this.route('test', {
    where: 'server',
    action: function() {
      console.log(this.request.body.make);
      console.log(this.request.body.model);
      this.response.writeHead(200, {'Content-Type': 'text/html'});
      this.response.end('hello!\n');
    }
  });
});

从命令行我可以点击此路线:

curl -X POST -H "Content-Type: application/json" -d '{"make":"honda","model":"civic"}' http://localhost:3000/test

在服务器终端中打印预期的hondacivic。看起来this.request.body已经被解析,因此您可以直接访问任何变量,如果您的输入是json,那就很好。

答案 2 :(得分:1)

为了读取原始主体,没有Node.js JSON-ify,以同步的方式,我使用了这个:

Router.route("my/api", function() {
    var rawBody = "";
    var chunk;
    while ((chunk = this.request.read()) !== null) {
        rawBody += chunk;
    }
}, { where: "server" });

(这里的另一个答案中提出的异步方式对我没有用,虽然它应该按照Node.js文档)。