node.js - Express-fileupload 无法上传大尺寸文件
问题描述
现在,我正在尝试上传一个大文件(2.75GB)。当我尝试上传大文件时,NodeJS 服务器死机并给我以下错误。可以上传其他小文件。OTL
node[38948]: ../src/node_file.cc:1833:void node::fs::WriteBuffer(const FunctionCallbackInfo<v8::Value> &): Assertion `args[3]->IsInt32()' failed.
1: 0x10009ce91 node::Abort() [/usr/local/bin/node]
2: 0x10009cd1a node::AppendExceptionLine(node::Environment*, v8::Local<v8::Value>, v8::Local<v8::Message>, node::ErrorHandlingMode) [/usr/local/bin/node]
3: 0x1000ac108 node::fs::WriteBuffer(v8::FunctionCallbackInfo<v8::Value> const&) [/usr/local/bin/node]
4: 0x10021da46 v8::internal::FunctionCallbackArguments::Call(v8::internal::CallHandlerInfo) [/usr/local/bin/node]
5: 0x10021d0c9 v8::internal::MaybeHandle<v8::internal::Object> v8::internal::(anonymous namespace)::HandleApiCallHelper<false>(v8::internal::Isolate*, v8::internal::Handle<v8::internal::HeapObject>, v8::internal::Handle<v8::internal::HeapObject>, v8::internal::Handle<v8::internal::FunctionTemplateInfo>, v8::internal::Handle<v8::internal::Object>, v8::internal::BuiltinArguments) [/usr/local/bin/node]
6: 0x10021c8b0 v8::internal::Builtin_Impl_HandleApiCall(v8::internal::BuiltinArguments, v8::internal::Isolate*) [/usr/local/bin/node]
7: 0x1007fd979 Builtins_CEntry_Return1_DontSaveFPRegs_ArgvOnStack_BuiltinExit [/usr/local/bin/node]
8: 0x100796ae2 Builtins_InterpreterEntryTrampoline [/usr/local/bin/node]
设置
// package.json
...
"scripts": {
"start": "node --max-old-space-size=4096 ./bin/www"
},
...
// app.js
const fileUpload = require('express-fileupload');
app.use(fileUpload());
// upload.js
const session = await mongoose.startSession();
session.startTransaction();
try {
const result = await Storage.create([attachment], {session: session});
await req.files.newFile.mv(attachment.filePath);
await session.commitTransaction();
return res.send(result[0]);
} catch (err) {
const message = "Can't save the attachment.";
console.error(message, err);
await session.abortTransaction();
return res.status(500).send(message);
} finally {
session.endSession();
}
解决方案
如 express-fileup 中所述,您可以添加限制。
app.use(fileUpload({
limits: { fileSize: 50 * 1024 * 1024 },
}));
对于文档中建议的大文件,使用临时文件而不是内存来管理上传过程。
// Note that this option available for versions 1.0.0 and newer.
app.use(fileUpload({
useTempFiles : true,
tempFileDir : '/tmp/'
}));
您可以阅读那里的文档以获取更多详细信息
推荐阅读
- docker - Docker镜像是Ubuntu系统,浏览器播放视频或音频时,如何进行录音?
- switch-statement - To Polymorphism、Switch Case、Cast 或多态重载多态
- javascript - 如何使用 chart.js 在条形图中沿水平线绘制多个颜色条
- flutter - 如何在 SliverAppBar 和 SliverList/Grid 之间添加一个额外的小部件?
- c - VS Code(Code Runner):接受 c 程序的用户输入
- plotly-express - 如何使用 Plotly Express 将符号序列映射到变量?
- javascript - 红绿灯问题。单击时切换颜色
- javascript - 仅清除画布的某些组件
- python - 数据框到 PostgreSQL 数据库
- javascript - 在密码字段内放置密码可见性图标