multer 中的 fileFilter 选项导致 request.file 未定义

问题描述 投票:0回答:2

我希望 Multer 只允许上传照片,但它不起作用,并给出 request.file = undefined ,同时给出正确的 file.mimetype = image/jpeg

这是来自邮递员的剪辑:

我还检查了标题,它包含

Content-Type = multipart/form-data; boundary=<calculated when request is sent>

然后我尝试并从 Multer 中删除了

fileFilter: multerFilter
配置,令人惊讶的是一切工作正常,没有任何问题。相关代码如下:

const multerStorage = multer.memoryStorage();

// 2) Creating a multer filter (to test if the uploaded file is really an image):
const multerFilter = (request, file, cb) => {
  if (file.mimetype.startsWith("image")) cb(null, true);
  cb(new AppError(400, `The only accepted files are images, please select an image ${request.file} file tyep: ${file.mimetype}`), false);
};

const upload = multer({ storage: multerStorage, fileFilter: multerFilter });

exports.updateMyPhoto = upload.single("photo");

请帮我找出我的 fileFilter 配置有什么问题

更新:

我在

multerFilter
内部的两种条件之间切换,程序现在运行得很好。新代码:

const multerFilter = (request, file, cb) => {
  if (!file.mimetype.startsWith("image")) cb(new AppError(400, `The only accepted files are images, please select an image ${request.file} file tyep: ${file.mimetype}`), false);
  cb(null, true);
  };

我仍然不知道这种行为的原因,所以我很感激你的帮助

javascript node.js express multer
2个回答
0
投票

您应该使用

cb
关键字调用回调函数
return
。否则,在第一个回调函数调用之后,您的代码将继续,最终将调用第二个回调函数,这将导致出现这个令人困惑的问题。要解决此问题,请使用
return
关键字更新您的代码:

const multerFilter = (request, file, cb) => {
  if (file.mimetype.startsWith("image")) return cb(null, true);
  return cb(new AppError(400, `The only accepted files are images, please select an image ${request.file} file tyep: ${file.mimetype}`), false);
};

0
投票

您的第一组代码确实可以工作......它只是没有按照您期望的方式工作。您认为您正在编写

if/else
,但看起来您只是调用了回调 (
cb
) 两次。这意味着第二个回调将始终执行。

关于是否在代码中包含大括号存在很多争论,并且两者都有争论,但如果您想避免一个错误来源,那么请始终包含大括号。 这个答案解释得最好。

尝试将您的第一个代码更改为:

const multerFilter = (request, file, cb) => {
   if (file.mimetype.startsWith("image")){
      cb(null, true);
   } else{
      cb(new AppError(400, `The only accepted files are images, please 
   select an image ${request.file} file tyep: ${file.mimetype}`), false);
   }
};
© www.soinside.com 2019 - 2024. All rights reserved.