NodeJS 无法使multer filefilter错误处理工作

brvekthn  于 2023-05-06  发布在  Node.js
关注(0)|答案(4)|浏览(132)

我在Node.js/Multer中尝试文件上传。
我得到了存储和限制工作。但是现在我正在使用filefilter来简单地通过mimetype拒绝一些文件,如下所示:

fileFilter: function (req, file, cb) {
 if (file.mimetype !== 'image/png') {
  return cb(null, false, new Error('goes wrong on the mimetype'));
 }
 cb(null, true);
}

当上传的文件不是PNG时,它不会接受它。但它也不会触发if(err)
当文件太大时,它会产生错误。因此,不知何故,我需要生成一个错误的filefilter以及,但我不知道如何猜测new Error是错误的。
那么,如果文件不正确,我应该如何生成错误呢?我做错了什么?
完整代码:

var maxSize = 1 * 1000 * 1000;

var storage =   multer.diskStorage({
  destination: function (req, file, callback) {
    callback(null, 'public/upload');
  },
  filename: function (req, file, callback) {
    callback(null, file.originalname);
  }
});

var upload = multer({
   storage : storage,
   limits: { fileSize: maxSize },
   fileFilter: function (req, file, cb) {
     if (file.mimetype !== 'image/png') {
       return cb(null, false, new Error('I don\'t have a clue!'));
     }
     cb(null, true);
   }

 }).single('bestand');

router.post('/upload',function(req,res){
    upload(req,res,function(err) {
        if(err) {
              return res.end("some error");
        }
    )}
)}
cwxwcias

cwxwcias1#

fileFilter函数有权访问请求对象(req)。此对象在路由器中也可用。
因此,在fileFitler中,您可以添加带有验证错误或验证错误列表的属性(您可以上传许多文件,其中一些可以通过)。在路由器中,您检查是否存在错误属性。
在过滤器中:

fileFilter: function (req, file, cb) {
 if (file.mimetype !== 'image/png') {
  req.fileValidationError = 'goes wrong on the mimetype';
  return cb(null, false, new Error('goes wrong on the mimetype'));
 }
 cb(null, true);
}

在路由器中:

router.post('/upload',function(req,res){
    upload(req,res,function(err) {
        if(req.fileValidationError) {
              return res.end(req.fileValidationError);
        }
    )}
)}
csbfibhn

csbfibhn2#

可以将错误作为第一个参数传递。

multer({
  fileFilter: function (req, file, cb) {
    if (path.extname(file.originalname) !== '.pdf') {
      return cb(new Error('Only pdfs are allowed'))
    }

    cb(null, true)
  }
})
rdlzhqv9

rdlzhqv93#

更改fileFilter并将错误传递给cb函数:

function fileFilter(req, file, cb){
   if(file.mimetype !== 'image/png'){
       return cb(new Error('Something went wrong'), false);
    }
    cb(null, true);
};
pepwfjgg

pepwfjgg4#

fileFilter回调应为:

fileFilter: async (req, file, cb) => {
    if (file.mimetype != 'image/png') {
        cb(new Error('goes wrong on the mimetype!'), false);
    }
    cb(null, true);
}

请求中的错误处理:

  • 使用MulterError时访问多路器错误
const multer = require("multer");

router.post('/upload', function(req, res) {
    upload(req, res, function(err) {

        // FILE SIZE ERROR
        if (err instanceof multer.MulterError) {
            return res.end("Max file size 2MB allowed!");
        }

        // INVALID FILE TYPE, message will return from fileFilter callback
        else if (err) {
            return res.end(err.message);
        }

        // FILE NOT SELECTED
        else if (!req.file) {
            return res.end("File is required!");
        }
 
        // SUCCESS
        else {
            console.log("File uploaded successfully!");
            console.log("File response", req.file);
        }

    )}
})

相关问题