1

对于传出的 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????

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

4

3 回答 3

2

该请求是一个传入的 http 消息,它是一个可读流,因此您可以通过从该流中读取来获取请求的数据。

以下应该可以工作(但我还没有测试过):

var readable = this.request;
var alldata = "";
readable.on('data', function(chunk) {
  alldata += chunk;
})
readable.on('end', function() {
  console.log('do something with alldata');
});
于 2013-12-05T00:29:05.383 回答
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

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

于 2013-12-05T01:05:46.487 回答
1

为了以同步方式读取原始正文,而不用 Node.js JSON 化它,我使用了这个:

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

(此处另一个答案中提出的异步方式对我不起作用,尽管它应该按照 Node.js 文档)。

于 2015-06-03T10:46:34.507 回答