使用节点版本 14.15.1 时,Express Multer 不起作用
Express Multer does not work when using node version 14.15.1
我有以下代码片段:
var fileUpload = multer({
storage: multer.diskStorage({
destination: function (req, file, cb) {
cb(null, './uploads/')
},
filename: function (req, file, cb) {
cb(null, Date.now() + file.originalname)
}
})
});
router.post("/addFile", fileUpload.single('newFile'), function (req, res) {
let _id = req.body.someId;
console.log("Adding File with id: " + _id);
// some database inserts and response
...
此代码在节点 v12 中 100% 正常工作。我可以上传任何大小的文件,但是一旦我更改为节点 v14.15.1,对于大于 60KB 的任何文件,上传行为都会很奇怪。查看文件系统,我可以看到上传工作正常,但路由内没有任何内容被执行。所以我可以在文件系统上看到该文件,但是 console.log
和任何数据库命令都不会执行。
查看请求,对于节点 14 上大于 60KB 的文件,我似乎从未收到响应 header。我假设没有收到对我的请求的响应 header 是上传的原因失败。
下面是执行文件上传的javascript
var formData = new FormData();
formData.append('newFile', $("#newFile")[0].files[0]);
formData.append('someId', $('#someId').val());
$.ajax({
url: './addFile',
data: formData,
contentType: false,
processData: false,
type: 'POST',
success: function (data) {
console.log('success upload')
});
我找到了问题的原因,但不知道如何解决。如果我设置 res.local
上传失败。如果我将其注释掉,上传将起作用。有谁知道 fix/workaround 这个:
app.use(function (req, res, next) {
req.connection = mysqlConnection;
res.locals = {
version: '1'
};
next();
});
app.use('/', indexRouter);
我将 req.connection
更改为 req.dbconn
这似乎解决了问题。
app.use(function (req, res, next) {
req.dbconn = mysqlConnection
res.locals = {
version: 'version'
};
next();
});
你的两行代码:
req.connection = mysqlConnection;
res.locals = {
version: '1'
};
应该避免,因为 req.connection 和 res.locals 在 express 中都是保留的 objects,第一个包含连接数据,如 IP 和其他 headers,而第二个应用于当前请求范围内的变量。根据您在代码中所做的其他事情,您正在覆盖这两个,并且很可能会破坏在这种情况下显示为 multer 中的错误的东西。您已经修复了 req.connection
问题,但您仍然可能会破坏使用 res.locals
的其他 middleware/functions,因此您可以添加自己的 属性 而不是像您那样重新初始化它喜欢:
res.locals.version = '1'
我有以下代码片段:
var fileUpload = multer({
storage: multer.diskStorage({
destination: function (req, file, cb) {
cb(null, './uploads/')
},
filename: function (req, file, cb) {
cb(null, Date.now() + file.originalname)
}
})
});
router.post("/addFile", fileUpload.single('newFile'), function (req, res) {
let _id = req.body.someId;
console.log("Adding File with id: " + _id);
// some database inserts and response
...
此代码在节点 v12 中 100% 正常工作。我可以上传任何大小的文件,但是一旦我更改为节点 v14.15.1,对于大于 60KB 的任何文件,上传行为都会很奇怪。查看文件系统,我可以看到上传工作正常,但路由内没有任何内容被执行。所以我可以在文件系统上看到该文件,但是 console.log
和任何数据库命令都不会执行。
查看请求,对于节点 14 上大于 60KB 的文件,我似乎从未收到响应 header。我假设没有收到对我的请求的响应 header 是上传的原因失败。
下面是执行文件上传的javascript
var formData = new FormData();
formData.append('newFile', $("#newFile")[0].files[0]);
formData.append('someId', $('#someId').val());
$.ajax({
url: './addFile',
data: formData,
contentType: false,
processData: false,
type: 'POST',
success: function (data) {
console.log('success upload')
});
我找到了问题的原因,但不知道如何解决。如果我设置 res.local
上传失败。如果我将其注释掉,上传将起作用。有谁知道 fix/workaround 这个:
app.use(function (req, res, next) {
req.connection = mysqlConnection;
res.locals = {
version: '1'
};
next();
});
app.use('/', indexRouter);
我将 req.connection
更改为 req.dbconn
这似乎解决了问题。
app.use(function (req, res, next) {
req.dbconn = mysqlConnection
res.locals = {
version: 'version'
};
next();
});
你的两行代码:
req.connection = mysqlConnection;
res.locals = {
version: '1'
};
应该避免,因为 req.connection 和 res.locals 在 express 中都是保留的 objects,第一个包含连接数据,如 IP 和其他 headers,而第二个应用于当前请求范围内的变量。根据您在代码中所做的其他事情,您正在覆盖这两个,并且很可能会破坏在这种情况下显示为 multer 中的错误的东西。您已经修复了 req.connection
问题,但您仍然可能会破坏使用 res.locals
的其他 middleware/functions,因此您可以添加自己的 属性 而不是像您那样重新初始化它喜欢:
res.locals.version = '1'