使用节点版本 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'