首页 > 解决方案 > multer:如何将变量传递给下一个处理程序

问题描述

multer用来上传图片。以下是我的multer配置:

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在下一个处理程序中获取对象。

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给下一个处理程序?

标签: javascripttypescriptexpressmiddlewaremulter

解决方案


multer中间件会自动设置objectfile上的属性,该属性req包含上传文件的信息,可以在下一个中间件中访问,所以你不需要自己设置它。

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

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


推荐阅读