引入了app.use(express.json());
req.body会自动被解析为json对象。
如果需要获取原始的请求体 buffer格式的二进制原始数据怎么办呢?
网络上的教程试了好多都不太好用了,好多都是几年前发的,又让引入其他的包,简直太反人类了。
看我的代码片段,直接搞定,实测好用:
const app = express();
// ================== 记录原始请求体 ===============
// 注意,顺序不能错,这个捕获原始请求体要在其他中间件前面
// 捕获原始请求体(注意看这一段代码!!!)
app.use(function (req, res, next) {
var reqData = [];
var size = 0;
req.on('data', function (data) {
reqData.push(data);
size += data.length;
});
req.on('end', function () {
req.reqData = Buffer.concat(reqData, size);
next();
});
});
// ================== 这些代码不用看 ===============
// 添加 express.json() 中间件来解析 JSON 格式的请求体
app.use(express.json());
// 添加 express.urlencoded() 中间件来解析 URL 编码的请求体
app.use(express.urlencoded({ extended: true }));
// 设置静态文件目录
app.use(express.static('public'));
// ================== 获取原始请求体 ===============
// 在其他中间件的后面再写这个,获取 req.reqData 就可以了
// 比如下面是我验签用的代码,判断请求头上面的md5
app.use((req, res, next) => {
// 在此处添加公共的前置处理逻辑
if (req.method == 'POST') {//MD5校验
//使用md5加密模块取原始请求的摘要
const reqData = req.reqData + Buffer.from(conf.key);
const md5 = crypto.createHash('md5').update(reqData).digest('hex');
if (md5 === req.headers['x']) {
next(); // 校验通过,调用 next() 以将控制权传递给下一个中间件或路由处理函数
} else {
res.status(403).send('请求被拒绝,MD5校验失败');
}
} else {
next(); // 调用 next() 以将控制权传递给下一个中间件或路由处理函数
}
});
// ================== 业务接口 ===============
// 世界播报接口 这是我的业务接口,当然在业务接口里面也是可以调用 req.reqData 获取原始请求的
app.post('/sendWordMessage', (req, res) => {
const requestBody = req.body;
// 遍历所有连接的客户端发送数据
clients.forEach(client => {
if (client.readyState === WebSocket.OPEN) {
client.send(JSON.stringify(requestBody));
}
});
res.sendStatus(200);
});
新增加一个用法,省时省力:
// 用express内置的方法捕获原始请求体
app.use(express.raw({ type: '*/*' }));
// 后续的中间件,路由 可以使用req.body 获取到请求体