首页 > 解决方案 > NodeJS Multer 无法捕捉 eroor

问题描述

如何捕获调用的错误并返回 res 状态消息?我无法在 userController.uploadFile 中发现任何错误,如果我尝试在 routes.post 中进行上传(req,res(err),则未定义 req。

var storage = multer.diskStorage({
    destination(req, file, cb) {
        cb(null, url);
    },
    filename: function (req, file, cb) {
        cb(null, file.fieldname + '-' + Date.now() + path.extname(file.originalname))
    }
}).single('file');
let upload = multer({
    storage: storage,
    limits: { fileSize: maxSize },
    fileFilter: (req, file, cb) => {
        console.log(file);
        if (file.mimetype !== 'image/jpeg' || file.mimetype !== 'image/png') {
          return cb(new Error('Only jpeg images allowed'))
        }
    
        cb(null, true)
      }
});

routes.post('/fileupload', upload, userController.uploadFile);

标签: javascriptnode.jsmulter

解决方案


我认为我们可以通过一些调整来实现它。我已经进行了这些更改并使用了一些图像进行了测试。

你的用户控制器看起来会有些不同,但这样的东西应该可以工作。

我已经更新将任何文件太大的错误传递给控制器​​,这将再次出现在 req.uploadError 属性中,因此您可以随意处理。

const userController = { 
    uploadFile(req, res) {
        if (req.uploadError) {
            res.status(400).send("An error occurred - " + req.uploadError.message);
        } else { 
            res.status(201).send("All good");
        }
    }
}

var storage = multer.diskStorage({
    destination(req, file, cb) {
        cb(null, url);
    },
    filename: function (req, file, cb) {
        cb(null, file.fieldname + '-' + Date.now() + path.extname(file.originalname))
    }
});

let upload = multer({
    storage: storage,
    limits: { fileSize: maxSize },
    fileFilter: (req, file, cb) => {
        console.log(file);
        if (file.mimetype !== 'image/jpeg' && file.mimetype !== 'image/png') {
            cb(new Error('Only jpeg or png images allowed'));
        } else {
            cb(null, true);
        }
    }
}).single('file');

routes.post('/fileupload', (req, res, next) => { 
    upload(req, res, err => {
        req.uploadError = err;
        next();
    })
}, userController.uploadFile);

推荐阅读