如何在Multer文件过滤器中同时返回状态码与自定义消息?
问题
我想用multer包实现上传文件的过滤器,目前验证功能正常,但想在用户上传错误文件时同时返回状态码和提示消息。现在能单独返回消息或状态码,但没法同时返回两者。
我的代码如下:
import { v4 as uuidv4 } from "uuid" import multer from "multer"; const AVAILABLE_IMAGE_FORMATS = ["image/jpg", "image/jpeg", "image/png", "image/gif"] const __dir_images__ = `${__dirname__}/../uploads/images` class HandledRespError { constructor(statusCode = 500, message = Messages.failed) { return { statusCode: statusCode, message: message } } } const multerStorageFileName = function(req, file, cb) { const uniqueName = uuidv4() + "--" + file.originalname return cb(null, uniqueName) } const imageStorage = multer.diskStorage({ destination: __dir_images__, filename: multerStorageFileName }); const imageFileFilter = function(req, file, cb) { if ( ! AVAILABLE_IMAGE_FORMATS.includes(file.mimetype) ) return cb(new HandledRespError(406), false) // 问题出在这里 cb(null, true) } export const imageUpload = multer({storage: imageStorage, fileFilter: imageFileFilter})
尝试过的情况:
- 使用
return cb( "my message", false)或return cb( new Error("my message"), false):能返回消息,但状态码是500 - 使用
return cb({statusCode:406, message: "my message"}, false):返回406状态码,但消息显示为[object object] - 更新尝试:
const exeption = new Error("Operation Failed!"); exeption.statusCode = 406,虽然生效但会返回冗余信息,另外还想把HTML响应改成JSON响应。
解决方案
1. 自定义带状态码的错误类
定义继承自Error的自定义错误类,既保留Error的特性,又能添加自定义状态码:
class MulterFileError extends Error { constructor(statusCode, message) { super(message); this.statusCode = statusCode; this.name = 'MulterFileError'; // 标记错误类型,方便后续识别 } }
2. 修改fileFilter逻辑
在fileFilter中抛出这个自定义错误,替代原来的普通对象:
const imageFileFilter = function(req, file, cb) { if (!AVAILABLE_IMAGE_FORMATS.includes(file.mimetype)) { return cb(new MulterFileError(406, '仅支持jpg/jpeg/png/gif格式的图片')); } cb(null, true); }
3. 添加全局错误处理中间件
Multer抛出的错误会被Express的错误处理中间件捕获,添加全局中间件处理这类错误并返回JSON格式响应:
// 全局错误处理中间件,需放在所有路由之后 app.use((err, req, res, next) => { // 判断是否为自定义的文件上传错误 if (err.name === 'MulterFileError') { return res.status(err.statusCode).json({ status: 'error', message: err.message }); } // 其他错误的默认处理 res.status(err.statusCode || 500).json({ status: 'error', message: err.message || '服务器内部错误' }); });
核心说明
- 自定义错误必须继承
Error:Multer内部会判断第一个参数是否为Error实例,否则会默认处理为500错误或把对象转成字符串导致[object object] - 全局中间件是关键:它能捕获Multer抛出的错误,按需求返回JSON格式响应并设置正确状态码,同时替代默认的HTML响应
内容的提问来源于stack exchange,提问作者Amirhossein Hassani
相关产品推荐
相关产品推荐

