NodeJs 如何解析从 Postman 发送的 post 正文

NodeJs how to parse post body sent from Postman

我有这个简单的 NodeJs 代码来处理 post 从任何其他来源(如 Postman)发送的请求

const http = require("http");
const { parse } = require("querystring");
const server = http.createServer(function (request, response) {
console.dir(request.param);

if (request.method === "POST") {
  let body = "";
  request.on("data", (chunk) => {
    body += chunk.toString(); // convert Buffer to string
  });
  request.on("end", () => {
    const result = parse(body);
    console.log(result);
    response.end("ok");
  });
 }
});

const port = 8080;
const host = "127.0.0.1";
server.listen(port, host);

当我从 Postman 发送 post 请求时使用 user:foo 之类的表单数据,我在终端中得到了这样的数据

[Object: null prototype] {
'----------------------------908153651530187984286555\r\nContent-Disposition: form-data; name': '"user"\r\n\r\nfoo\r\n----------------------------908153651530187984286555--\r\n'

当我运行

console.log(result.user)

我得到undefined

我把解析体const result = parse(body);改成了这个

const result = JSON.parse(JSON.stringify(body))

我得到了

----------------------------939697314758807513697606  
Content-Disposition: form-data; name="user"

foo
----------------------------939697314758807513697606--

但还是得不到result.user

如何通过将此类数据转换为对象来处理此类数据并让用户像这样result.user

如果您的 body 中的数据是 JSON object,您可以删除块中的 toString 并将解析替换为 JSON.parse,如下所示:

  let body = "";
  request.on("data", (chunk) => {
    body += chunk; // convert Buffer to string
  });
  request.on("end", () => {
    const result = JSON.parse(body);
    console.log(result);
    response.end("ok");
  });

如果您从邮递员发送数据时选择“原始”和“JSON”,这将正常工作,在 body 中发送如下 object:

{
    "user": "john"
}

如果数据作为“x-www-form-urlencoded”发送,您当前的方法(使用查询字符串的解析方法)应该可以正常工作。

简而言之,解决方案是修改您发送到服务器的请求的 Content-Type header。