body-parser无法正常工作求助(附Express示例代码)
解决Express中请求体解析失败的问题
哈哈,这个坑我刚入门Express的时候也踩过!你的问题其实就出在两个小细节上,说穿了特别简单——中间件的加载顺序,还有一个Express版本的小知识点。
原代码的问题分析
先看你原来的代码结构:
// 先定义了路由 app.post("/api/login", (req, res) => { if (!req.body) return res.sendStatus(400); res.send("welcome, " + req.body.username); }); // 才加载JSON解析中间件 app.use(express.json()); app.use(bodyParser.json());
Express的中间件是按照注册顺序依次执行的,当请求打到/api/login路由时,解析JSON的中间件还没被触发,所以req.body还是undefined,直接触发了!req.body的判断,返回400状态码。
另外还有个冗余点:你同时用了express.json()和bodyParser.json(),其实从Express 4.16.0开始,express.json()就是bodyParser.json()的内置封装,完全可以替代它,不需要再单独安装和引入body-parser包了。
修正后的代码
把解析中间件放在所有路由之前,并且去掉多余的依赖:
"use strict"; const PORT = 3000; const express = require("express"); const app = express(); // 先加载JSON解析中间件,确保所有请求都先完成请求体解析 app.use(express.json()); // 再定义业务路由 app.post("/api/login", (req, res) => { if (!req.body) return res.sendStatus(400); res.send("welcome, " + req.body.username); }); console.log(`Listen on port ${PORT}`); app.listen(PORT);
测试验证
现在重新运行你的测试命令:curl -H "Content-Type: application/json" -X POST -d '{"username":"xyz","password":"xyz"}' http://localhost:3000/api/login
就能正常返回welcome, xyz啦!
内容的提问来源于stack exchange,提问作者Andreas
相关产品推荐
相关产品推荐

