关于 javascript:multer: 如何将变量传递给下一个处理程序

multer: how to pass variables to next handler

我正在使用 multer 上传图片。以下是我的 multer 配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import multer from"multer";
import * as mime from"mime-types";
import path from"path";

export const storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null,"uploads/");
  },
  filename: function (req: any, file, cb) {
    const name = path.parse(file.originalname).name +"_" + Date.now();
    const extension = mime.extension(file.mimetype);
    const filename = `${name}.${extension}`;
    /**
    req.fileInfo = {
      filename,
      name,
      extension
    } */

    cb(null, filename);
  },
});
export const upload = multer({ storage: storage });

我想在下一个处理程序中获取 fileInfo 对象。

1
2
3
4
5
6
7
8
import { upload } from"src/middlewares/imageUpload";

router.post('/imageUpload', upload.single("upload"), async (req, res) => {

//
const filename = req.fileInfo.filename;

});

根据这个答案,res.local 是在中间件和处理程序之间存储变量的正确位置。

但 multer diskStorage 配置不接受 res 参数。我试图将 fileInfo 对象存储在 req 中,但有时它有效,有时无效(req.fileInfo 对于某些路由未定义,尽管代码完全相同)。

如何将 fileInfo 传递给下一个处理程序?


multer 中间件会自动在 req 对象上设置名为 file 的属性,该属性包含上传文件的信息,可以在下一个中间件中访问,因此您无需自行设置。

如果您仍然想这样做,您可以将 fileInfo 对象附加到 req 对象,但它仅在 multer 中间件是管道中的中间件之一的下一个处理程序中可用。所以 req.fileInfo 对于请求不通过 multer 中间件的路由将是未定义的。

您可以使每个请求都通过 multer 中间件,但如果该请求不包含任何应上传的文件,则 req.fileInfo 将是未定义的,因为 multer 没有上传任何文件。