【问题标题】:Express.json not parsing POST body - undefinedExpress.json 不解析 POST 正文 - 未定义
【发布时间】:2020-09-21 21:11:28
【问题描述】:

从我想要使用的 IoT API 接收到的 JSON POST 数据。注意多部分表单数据。有时可以附加图像文件,但我对处理图像部分不感兴趣:

POST {
  host: '192.168.78.243:3000',
  accept: '*/*',
  'content-length': '1178',
  'content-type': 'multipart/form-data; boundary=------------------------f519f81dc2e1d562'
}
--------------------------f519f81dc2e1d562
Content-Disposition: form-data; name="event"; filename="event_3913.json"
Content-Type: application/octet-stream

{"packetCounter":"3913",
"capture_timestamp":"1600677267347",
"datetime":"20200921 204027000",
"stateUTF8":"ABC123",
"stateASCII":"ABC123",
.....

我想访问 JSON 数据,并且正在使用 express。根据this SO answer,我已经用 express.json() 尝试过这种方法:

const express = require('express');
const bodyParser = require('body-parser');

const app = express();

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

app.post('/test', (req, res) =>{
    if (req.method === 'POST') {
        console.log('POST request recd');
    }
    console.log(req.body);
    res.status(200).send('It works');
});

app.listen(3000, () => console.log('server started'));

但是我在控制台上得到的只是undefined {}

更新

即使导入正确,express/body-parser 方法也不起作用。

下面的这个方法有效,只要它证明正在接收一个 POST 请求。但我需要使用 express 方法才能访问传入的数据:

let buffers = [];
const http =require('http')
http.createServer((request, response) => {
    console.log('Now we have a http message with headers but no data yet.');
    if (request.method === 'POST' && request.url === '/test') {
        console.log('Hit');
    }
    request.on('data', chunk => {
        console.log('A chunk of data has arrived: ', chunk);
        buffers.push(chunk);
    });
    request.on('end', () => {
        console.log('No more data');
        let body = Buffer.concat(buffers);
        console.log(String(body));
    })
}).listen(3000)

如何使用 express 获取数据?

【问题讨论】:

  • 你可以使用body-parser中间件expressjs.com/en/resources/middleware/body-parser.html
  • 我试过 app.use(express.bodyParser());并使用 npm install --save body-parser 安装,但我仍然得到 body-parser 需要单独安装??
  • 你还需要单独要求,它不是 express 的一部分
  • 您提到来自 API 的数据看起来像 .... 所以我想知道您是从服务器访问 api 还是从某个前端将数据传到您的服务器? (请详细说明您的应用程序的目的)此外,不需要 Express 版本 4.16+ 正文解析器
  • @NishaDave API 数据来自物联网设备。

标签: javascript node.js json


【解决方案1】:

您安装了body-parser,但尚未导入body-parser 才能工作。

const express = require('express');
const bodyParser = require('body-parser');

const app = express();

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

app.use(express.static('public'));

app.get('/', (req, res) => {
  res.sendFile('public/index.html');
}); 

app.post('/test', (req, res) =>{
  console.log(req.body);
  res.status(200).send('It works');
});

app.listen(3000, () => console.log('server started'));

更新答案

const express = require('express');
const bodyParser = require('body-parser');

const app = express();

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

app.use(express.static('public'));

app.get('/', (req, res) => {
  res.send(`<form action="/test" method="POST" >
  <label for="fname">First name:</label>
  <input type="text" id="fname" name="fname"><br><br>
  <label for="lname">Last name:</label>
  <input type="text" id="lname" name="lname"><br><br>
  <input type="submit" value="Submit">
</form>`)
}); 

app.post('/test', (req, res) =>{
  console.log(req.body);
  res.status(200).send('It works');
});

app.listen(3000, () => console.log('server started'));

在线试用https://repl.it/join/ldopaeji-pprathameshmore

【讨论】:

  • 它现在可以编译 - 但 req.body 仍然是 {}。
  • 您是否在发出post 请求?
  • API 数据一定有一些不同 - 因为它是未定义的 POST 数据。
  • 是的。仍然 {} - 那是剪切 n 粘贴减去您的假数据方法。
【解决方案2】:
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
app.use(express.json());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

app.post('192.168.78.243:3000/', (req,res) =>{
console.log(req.body.stateUTF8);
console.log(req.body);
res.sendStatus(200);
});
app.listen(3000, ()=> console.log('listening'));

试试这个!!

【讨论】:

  • 按照其他答案的建议声明主体解析器中间件后执行此操作。
  • 关于我的样本数据的 nametoserver 是什么?
  • 只是显示你将在服务器端“nametoserver”调用的变量名,它位于“:”的左侧,你可以给任何名字。
猜你喜欢
  • 2021-01-13
  • 1970-01-01
  • 2014-03-06
  • 1970-01-01
  • 1970-01-01
  • 2014-03-20
  • 2023-04-10
  • 1970-01-01
  • 2016-02-05
相关资源
最近更新 更多