Express.js如何获取POST请求的实际body JSON并查询ReqBody任意字段
Express.js 获取POST请求原始JSON及动态读取字段方案
前置配置确认
首先确保你已经在Express实例中注册了JSON解析中间件,否则req.body会是undefined,Express v4.16.0及以上版本内置了该中间件,配置代码如下:
const express = require('express'); const app = express(); // 注册JSON解析中间件 app.use(express.json()); // 如果是路由拆分的场景,也可以给路由单独注册 // router.use(express.json())
1. 动态读取req.body中的任意字段
JS对象支持方括号语法读取动态属性,不需要提前知道字段名,只需要把字段名作为字符串传入方括号即可,不管是固定的username还是任意自定义字段foo都可以用这个方式读取:
router.post('/', function (req, res, next){ let body = req.body; // 示例1:读取固定字段foo,等价于body.foo const fooValue = body['foo']; // 示例2:读取动态变量指定的字段,比如字段名存在变量fieldName里 const fieldName = '任意你要读取的字段名'; const targetValue = body[fieldName]; // 可以加个判断避免字段不存在返回undefined if(targetValue === undefined) { return res.status(400).send(`缺少字段${fieldName}`); } });
2. 获取原始的JSON请求字符串
如果需要拿到未被解析的原始JSON字符串,有两种实现方式:
方式1:配置express.json的verify选项收集原始数据
在注册中间件的时候添加verify配置,把原始buffer存到req对象上:
app.use(express.json({ verify: (req, res, buf) => { // 把原始请求buffer存到req.rawBody上,转成字符串就是原始JSON req.rawBody = buf.toString(); } })); // 路由里就可以直接取 router.post('/', function (req, res, next){ const originalJsonStr = req.rawBody; console.log(originalJsonStr); // 就是前端传过来的原始JSON字符串 });
方式2:单独写原始请求体解析中间件
如果不想修改默认的json中间件配置,也可以单独写中间件处理:
// 原始请求体解析中间件 const rawBodyParser = (req, res, next) => { let buf = []; req.on('data', chunk => buf.push(chunk)); req.on('end', () => { req.rawBody = Buffer.concat(buf).toString(); // 继续走后续的json解析中间件 next(); }); } // 路由使用时先加这个中间件 router.post('/', rawBodyParser, express.json(), function (req, res, next){ const originalJsonStr = req.rawBody; // 原始JSON字符串 const body = req.body; // 解析后的对象 });
内容的提问来源于stack exchange,提问作者Aviv Vetaro
相关产品推荐
相关产品推荐

