如何在Express.js中获取POST请求体对应的Buffer对象
获取Express请求体Buffer对象的实现方案
Express 内置的常规 body 解析中间件(express.json()、express.urlencoded())仅针对特定内容类型解析,默认不会输出原始 Buffer 格式的请求体,你可以通过以下两种方式实现需求,适配任意内容类型、二进制数据的请求场景:
首先需要修正你代码里的路由方法问题:GET 规范下不携带请求体,处理 POST 类带请求体的请求请使用app.post()或app.all()注册路由。
方案1:使用内置中间件(Express 4.16+ 推荐,零额外依赖)
Express 4.16 及以上版本自带express.raw()中间件,原生支持将请求体解析为 Buffer 对象,只需要修改匹配规则覆盖所有内容类型即可:
import express from "express"; const app = express(); // 配置raw解析器,匹配所有Content-Type,可自行调整limit参数设置最大请求体大小 app.use(express.raw({ type: "*/*", limit: "50mb" })); app.post("/", (req, res) => { // 此处req.body即为Buffer类型 console.log(Buffer.isBuffer(req.body)); // 输出true // 直接对req.body做业务处理即可 res.send(`已接收请求体,Buffer长度:${req.body.length}`); }); app.listen(3000);
方案2:自定义解析中间件(兼容所有Express版本,完全可控)
如果你的Express版本较低,或者需要更灵活的解析逻辑,可以直接监听请求流自行拼接Buffer,不需要引入任何第三方包:
import express from "express"; const app = express(); // 自定义原始请求体解析中间件 app.use((req, res, next) => { // GET/HEAD请求默认无请求体,直接返回空Buffer if (["GET", "HEAD"].includes(req.method)) { req.body = Buffer.alloc(0); return next(); } const chunks = []; req.on("data", (chunk) => chunks.push(chunk)); req.on("end", () => { req.body = Buffer.concat(chunks); next(); }); req.on("error", (err) => next(err)); }); app.post("/", (req, res) => { // 此处req.body即为Buffer类型 console.log(Buffer.isBuffer(req.body)); // 输出true // 业务处理逻辑 res.send(`已接收请求体,Buffer长度:${req.body.length}`); }); app.listen(3000);
注意事项:不要在上述Buffer解析中间件之前注册
express.json()、express.urlencoded()、multer等会消费请求流的其他body解析中间件,否则请求流会被提前读取,无法拿到完整的原始Buffer数据。
内容的提问来源于stack exchange,提问作者c136
相关产品推荐
相关产品推荐

