【问题标题】:Node.js: Access JSON body of HTTP POST request with expressNode.js:使用 express 访问 HTTP POST 请求的 JSON 正文
【发布时间】:2021-01-11 17:57:27
【问题描述】:

我正在向我的 Express Web 服务器发送一个 http post 请求,将虚拟数据作为 json 发送。它正确接收请求并可以发回一个 json 对象,但由于某种原因它无法访问 post 请求正文。

我正在使用此代码进行快递:

const express = require('express');
const app = express();
const port = 3000;

app.post('/test', (req, res) => {
  console.log(req.body);
  res.json({"some": "thing"});
});

app.listen(port, () => {
  console.log(`Listening at http://localhost:${port}`)
});

这是请求的代码:

const req = http.request({
    hostname: '127.0.0.1',
    port: 3000,
    path: '/test',
    method: 'POST',
    json: {
        url: "https://www.nothing.com",
        name: "hello"
    }
}, res => {
    console.log(`statusCode: ${res.statusCode}`)
  
    res.on('data', d => {
      process.stdout.write(d)
    })
  })
  
  req.on('error', error => {
    console.error(error)
  })
  
  req.end()

如您所见,我在本地运行它。客户端收到状态码 200 和服务器发送的 json {"some": "thing"},但服务器从 req.body 获取“未定义”。我尝试使用:

headers: {
   'Content-Type': 'application/json'
}
body: JSON.stringify({
            url: "https://www.nothing.com",
            name: "hello"
        })

直接在请求选项中代替json,但无济于事。我什至按照某人的建议尝试使用app.use(express.json());

有什么问题?

【问题讨论】:

  • 请添加此行 req.write(data);之前 req.end();

标签: node.js json express http-post


【解决方案1】:

显然我做 post 请求的方式不正确,我不得不用 req.write() 在单独的行中发送正文,如下所示:

const http = require('http');
const data = JSON.stringify({ //<--- data to send as body
    url: "https://www.nothing.com",
    name: "hello"
});

const req = http.request({
    hostname: '127.0.0.1',
    port: 3000,
    path: '/test',
    method: 'POST',
    headers: {
        'Content-Type': 'application/json'
    }
}, res => {
    console.log(`statusCode: ${res.statusCode}`);
  
    res.on('data', d => {
      process.stdout.write(d);
    })
  })
  
  req.on('error', error => {
    console.error(error);
  })
  req.write(data); //<--- this line
  req.end();

【讨论】:

    【解决方案2】:

    【讨论】:

    • 我在另一个答案中读到,从特定版本的 express 开始不需要 body-parser,您只需使用 app.use(express.json()) 作为正文解析器。无论哪种方式,我已经使用了您建议的模块,但仍然无法正常工作。
    • 需要body-parser,但不需要单独安装
    • 是的,正如我所说,我已经使用了您在上一个链接中解释的解析器:app.use(express.json()); app.use(express.urlencoded());但我仍然得到一个空对象。你测试过我的代码吗?
    猜你喜欢
    • 2015-05-31
    • 2012-07-22
    • 2014-09-19
    • 2015-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-03
    相关资源
    最近更新 更多