从Node.js服务器本机访问JSON POST有效负载

时间:2017-04-01 20:13:53

标签: json node.js post payload

考虑对Node.js服务器的以下HTTP POST调用:

curl -H "Content-Type: application/json" \
     -X POST \
     -d '{"jsonKey":"jsonValue"}' \
     'http://localhost:8080?abcd=efgh'

我想访问POST请求的URL参数和JSON有效负载。

导入url.parse

,访问网址参数非常简单
var server = http.createServer(function(req, res) {
        // Parse the params - prints "{ abcd: 'efgh' }"
        var URLParams = url.parse(req.url, true).query;
        console.log(URLParams);

        // How do I access the JSON payload as an object?
}

但是如何使用本机Node.js库(没有任何npm导入)访问JSON有效负载?

我尝试了什么

  • req打印到console.log,但未找到POST对象
  • 阅读req <{3}}
  • 类型的{{1}}文档

3 个答案:

答案 0 :(得分:3)

来自文档:

  

当收到POST或PUT请求时,请求正文可能是   对您的应用程序很重要获取身体数据有点儿   比访问请求标头更复杂。请求对象   传入处理程序的实现ReadableStream接口。   就像其他流一样,可以在其他地方收听或传输此流   流。我们可以通过收听来直接从流中获取数据   流的'数据'和'结束'事件。

     

https://nodejs.org/en/docs/guides/anatomy-of-an-http-transaction/#request-body

var server = http.createServer(function(req, res) {
        // Parse the params - prints "{ abcd: 'efgh' }"
        var URLParams = url.parse(req.url, true).query;
        console.log(URLParams);

        // How do I access the JSON payload as an object?
        var body = [];
        req.on('data', function(chunk) {
            body.push(chunk);
        }).on('end', function() {
            body = Buffer.concat(body).toString();
            if (body) console.log(JSON.parse(body));
            res.end('It Works!!');
        });
});

答案 1 :(得分:1)

req是一个流,因此您访问它的方式取决于您希望如何使用它。如果您只想将其作为文本获取并将其解析为JSON,则可以执行以下操作:

let data = "";
req.on("readable", text => data += text);
req.on("end", () => {
  try {
    const json = JSON.parse(data);
  }
  catch (err) {
    console.error("request body was not JSON");
  }
  /* now you can do something with JSON */
}); 

答案 2 :(得分:1)

只是一个补充;如果您想从POST正文创建对象,则使用以下代码:

const body2Obj = chunk => {
  let body = {};
  let string = chunk.toString();
  if (!string.trim()) return body;
  string.split('&').forEach(param => {
    let elements = param.split('=');
    body[elements[0]] = elements[1];
  });
  return body;
};

然后使用上面stdob--所解释的方法:

var body = [];
req.on('data', chunk => {
  body.push(chunk);
}).on('end', () => {
  body = Buffer.concat(body);
  body = body2Obj(body);
  // ...
});

我更喜欢这种解决方案,而不是使用超大的第三方模块来仅解析请求的主体(有时,出于某些原因,人们建议这样做)。可能是我的版本较短。当然,这仅适用于url编码的格式化主体。