在 Express 应用程序中收到来自 body-parser 的膨胀响应
receiving inflated response from body-parser in express app
完整的示例:
我正在从前端发送一些二进制数据:
fetch("http://localhost:8081/api", {
"headers": {
"accept": "*/*",
"accept-language": "en-US,en;q=0.9,hr-HR;q=0.8,hr;q=0.7,es-US;q=0.6,es;q=0.5",
"content-type": "application/octet-stream",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-site",
},
"body": "[{\"id\":\"NiDBzAiEWRHo6dsfw\",\"classIndex…\u00020š\u0002points…\u0002[39,4§\u000241³\u00022³\u00023³\u00024³\u00025³\u00026³\u00027³\u00028³\u0002²\u00025§\u00025·\u00025¹\u00025»\u00025½\u00025¿\u00025Á\u00025Ã\u00025Å\u00025²\u00023Ì\u0002,Ü\u0002»\u0002Ü\u0002½\u0002Ü\u0002¿\u0002Ü\u0002Á\u0002Ü\u0002Ã\u0002Ü\u0002Å\u0002Ü\u0002Û\u00026§\u000236·\u0002ï\u0002¹\u0002ï\u0002à\u00026â\u00026ä\u00026æ\u00026è\u00026ê\u00026Û\u00027î\u00027ñ\u00027ó\u00027½\u0002ü\u0002¹\u0002ü\u0002»\u0002ü\u0002‰\u00037¿\u0002ü\u0002Á\u0002ü\u0002Ã\u0002ü\u0002Å\u0002ü\u0002²\u0002þ\u0002§\u0002þ\u0002·\u0002þ\u0002‹\u00038\u00038‰\u00038‘\u00038“\u00038•\u00038—\u00038™\u00039›\u00039\u00039¹\u00029ö\u0002,´\u0003¿\u0002´\u0003Á\u0002´\u0003Ã\u0002´\u0003Å\u0002´\u0003²\u00029‚\u0003¶\u0003„\u0003Ã\u0003³\u00037»\u0002Á\u0003½\u0002Á\u0003¸\u00037º\u00037¼\u00037¾\u00037²\u000212Ç\u0003,Õ\u0003ˆ\u0003Ø\u0003Ö\u0003¿\u0002Ù\u0003Á\u0002Ù\u0003Ã\u0002Ù\u0003Å\u0002Ù\u0003Ô\u000328§\u0002Õ\u00038·\u00021Ö\u0002»\u0002ì\u0003Ú\u0003ï\u0003Ý\u0003Ö\u0002ß\u0003Ö\u0002á\u0003Ö\u0002ã\u0003Ö\u0002Ô\u0003Ø\u0002è\u0003Ø\u0002ë\u0003Ø\u0002¹\u0002ì\u0003 \u0003Ø\u0003®\u0003ã\u0003®\u0003Ô\u0003°\u0003è\u0003°\u0003ë\u0003°\u0003€\u0004°\u0003î\u0003°\u0003½\u00021°\u00035]}]",
"method": "POST",
"mode": "cors",
"credentials": "omit"
});
后台接收:
const bodyParser = require("body-parser");
const express = require("express");
const cors = require("cors");
const octetStreamParser = bodyParser.raw({
inflate: false,
type: "application/octet-stream",
limit: "200mb",
});
const app = express();
app.use(cors());
app.post("/api", octetStreamParser, (req, res) => {
console.log(req.body.buffer);
const bufferString = Buffer.from(req.body.buffer).toString();
console.log(bufferString);
res.json({ status: "success" });
});
app.listen(8081, () => {
console.log("Server", `Server is listening on port 8081`);
});
即使我设置了 inflate: false
,缓冲区仍被一些随机代码膨胀。我在这里错过了什么?我已经从前端通过线路发送了 445 个字节,但我每次都收到固定大小的 8192 字节响应。
也许值得一提的是 inflation 似乎每次请求小于 x 字节时都会发生。我认为大约是 1-2k 字节,不确定。
修复非常简单,请使用 req.body
而不是 req.body.buffer
。说明 here.
完整的示例:
我正在从前端发送一些二进制数据:
fetch("http://localhost:8081/api", {
"headers": {
"accept": "*/*",
"accept-language": "en-US,en;q=0.9,hr-HR;q=0.8,hr;q=0.7,es-US;q=0.6,es;q=0.5",
"content-type": "application/octet-stream",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-site",
},
"body": "[{\"id\":\"NiDBzAiEWRHo6dsfw\",\"classIndex…\u00020š\u0002points…\u0002[39,4§\u000241³\u00022³\u00023³\u00024³\u00025³\u00026³\u00027³\u00028³\u0002²\u00025§\u00025·\u00025¹\u00025»\u00025½\u00025¿\u00025Á\u00025Ã\u00025Å\u00025²\u00023Ì\u0002,Ü\u0002»\u0002Ü\u0002½\u0002Ü\u0002¿\u0002Ü\u0002Á\u0002Ü\u0002Ã\u0002Ü\u0002Å\u0002Ü\u0002Û\u00026§\u000236·\u0002ï\u0002¹\u0002ï\u0002à\u00026â\u00026ä\u00026æ\u00026è\u00026ê\u00026Û\u00027î\u00027ñ\u00027ó\u00027½\u0002ü\u0002¹\u0002ü\u0002»\u0002ü\u0002‰\u00037¿\u0002ü\u0002Á\u0002ü\u0002Ã\u0002ü\u0002Å\u0002ü\u0002²\u0002þ\u0002§\u0002þ\u0002·\u0002þ\u0002‹\u00038\u00038‰\u00038‘\u00038“\u00038•\u00038—\u00038™\u00039›\u00039\u00039¹\u00029ö\u0002,´\u0003¿\u0002´\u0003Á\u0002´\u0003Ã\u0002´\u0003Å\u0002´\u0003²\u00029‚\u0003¶\u0003„\u0003Ã\u0003³\u00037»\u0002Á\u0003½\u0002Á\u0003¸\u00037º\u00037¼\u00037¾\u00037²\u000212Ç\u0003,Õ\u0003ˆ\u0003Ø\u0003Ö\u0003¿\u0002Ù\u0003Á\u0002Ù\u0003Ã\u0002Ù\u0003Å\u0002Ù\u0003Ô\u000328§\u0002Õ\u00038·\u00021Ö\u0002»\u0002ì\u0003Ú\u0003ï\u0003Ý\u0003Ö\u0002ß\u0003Ö\u0002á\u0003Ö\u0002ã\u0003Ö\u0002Ô\u0003Ø\u0002è\u0003Ø\u0002ë\u0003Ø\u0002¹\u0002ì\u0003 \u0003Ø\u0003®\u0003ã\u0003®\u0003Ô\u0003°\u0003è\u0003°\u0003ë\u0003°\u0003€\u0004°\u0003î\u0003°\u0003½\u00021°\u00035]}]",
"method": "POST",
"mode": "cors",
"credentials": "omit"
});
后台接收:
const bodyParser = require("body-parser");
const express = require("express");
const cors = require("cors");
const octetStreamParser = bodyParser.raw({
inflate: false,
type: "application/octet-stream",
limit: "200mb",
});
const app = express();
app.use(cors());
app.post("/api", octetStreamParser, (req, res) => {
console.log(req.body.buffer);
const bufferString = Buffer.from(req.body.buffer).toString();
console.log(bufferString);
res.json({ status: "success" });
});
app.listen(8081, () => {
console.log("Server", `Server is listening on port 8081`);
});
即使我设置了 inflate: false
,缓冲区仍被一些随机代码膨胀。我在这里错过了什么?我已经从前端通过线路发送了 445 个字节,但我每次都收到固定大小的 8192 字节响应。
也许值得一提的是 inflation 似乎每次请求小于 x 字节时都会发生。我认为大约是 1-2k 字节,不确定。
修复非常简单,请使用 req.body
而不是 req.body.buffer
。说明 here.