【发布时间】:2019-09-24 14:02:07
【问题描述】:
我想在以下情况下限制上传的请求大小(简化):
app = Express();
router = Express.Router();
router.use('/upload', (req, res, next) => {
const writeStream = fs.createWriteStream('filename');
req.pipe(writeStream);
});
app.use(router);
如您所见,没有使用任何形式或类似的形式(无法更改)。因此,数据以原始数据流的形式提供。
由于我在这种情况下找不到任何现有模块(body-parser 不适用于这种情况,也不能使用 raw-body,因为流应该保持不变),我目前的方法是使用以下代码作为 express 的中间件:
function(req, res, next) {
if (req.headers['content-length'] > limit) {
res.set("Connection", "close");
res.status(413).end();
return;
}
let received = 0;
req.on('data', (chunk) => {
received += chunk.length;
if (received > limit) {
res.set("Connection", "close");
res.status(413).end();
}
})
next();
})
有没有更好的方法来做到这一点?是否有任何现有的 npm 包可以完成这项工作?
【问题讨论】:
-
如果您使用
multer上传文件,它可以选择设置限制limits: { fileSize: maxSize }否则this 可能会有所帮助。 -
谢谢,但正如我上面所写的,数据不是作为表单/多部分数据提供的,而是作为原始数据提供的。因此我不能使用 multer,我尝试了提供的链接中的所有步骤,但似乎没有一个工作。
-
你说生的身体应该不受影响。
body-parser确实有一个选项可以做到这一点bodyParser.raw(options)source 其中一个选项是设置限制/大小。 -
好的,我已经看到了,但据我所知,原始 bodyparser 读取完整流(“包含解析数据的新主体对象在中间件之后填充在请求对象上(即 req.身体)。”)。因此,以后无法再使用该流。
-
是的!它会做到这一点。也许我没有正确得到要求。不确定除了编写自己的中间件来计算大小之外是否还有另一种方法来获得大小,或者您依赖
content-length header (both here). Alsobuffers`的方式可以转换为streams,但我猜这违背了这里的目的。跨度>