express-validator报错返回[object Object]、500状态码的修复方法问询
问题原因
Error构造函数仅支持字符串类型的入参,你传入errors.array()这个对象数组时,JS会自动调用数组的toString()方法,对象转字符串就会得到[object Object],这是返回内容异常的直接原因- 你在校验中间件里直接抛出未捕获的错误,Express默认错误处理逻辑会直接返回500状态码,不符合参数校验失败返回400的语义
修复方案
方案1:直接在校验中间件返回错误响应(最简便)
修改你的validate函数,不要抛出错误,直接构造JSON响应返回:
export const validate = (req, res, next) => { const errors = validationResult(req); if (!errors.isEmpty()) { // 参数校验失败默认返回400状态码,直接返回错误数组 return res.status(400).json({ errors: errors.array() }); } next(); };
改完后校验失败时会直接返回400状态码,响应体就是你控制台看到的错误数组结构,和预期完全一致。
方案2:搭配全局错误中间件使用(适合有统一错误处理规范的项目)
如果你项目需要统一收口所有错误的返回格式,可以调整为把错误信息传给全局中间件处理:
- 修改validate中间件:
export const validate = (req, res, next) => { const errors = validationResult(req); if (!errors.isEmpty()) { const validationError = new Error('参数校验失败'); validationError.statusCode = 400; validationError.errors = errors.array(); return next(validationError); } next(); };
- 在所有路由之后注册全局错误处理中间件:
app.use((err, req, res, next) => { const statusCode = err.statusCode || 500; const resData = { message: err.message, }; if (err.errors) { resData.errors = err.errors; } return res.status(statusCode).json(resData); });
内容的提问来源于stack exchange,提问作者simon
相关产品推荐
相关产品推荐

