NodeJS Express中Celebrate中间件full模式不生效如何获取全量校验错误
解决方案
你的配置参数位置错误,且未关闭Joi默认的提前终止校验逻辑,调整后即可一次性返回所有字段的校验错误:
正确配置代码
const insert = celebrate({ [Segments.BODY]: Joi.object().keys({ nome: Joi.string().required().max(255), ativo: Joi.string().required().max(1), descricao: Joi.string().required().max(255), }) }, { // Joi校验配置:关闭遇到第一个错误就终止校验的规则,遍历校验所有字段 abortEarly: false }, { // Celebrate配置:返回全量校验错误信息 mode: 'full' });
配套全局错误处理(可选)
如果需要统一格式化返回的错误结构,可以在所有路由之后添加Express全局错误处理中间件,批量提取所有错误字段:
app.use((err, req, res, next) => { // 捕获Celebrate抛出的校验错误 if (err.joi) { const errorList = err.joi.error.details.map(item => ({ field: item.path.join('.'), message: item.message })); return res.status(400).json({ msg: '参数校验失败', errors: errorList }); } // 其他业务错误处理 res.status(err.status || 500).json({ msg: err.message || '服务器内部错误' }); });
abortEarly是Joi内置配置,默认值为true,遇到第一个不满足规则的字段就直接终止校验,这是你之前每次仅返回单个字段错误的核心原因mode: 'full'是Celebrate的配置,开启后会将所有校验路径(body、params、query等)的错误全部返回,不会只返回首个校验失败路径的错误
内容的提问来源于stack exchange,提问作者Ronnei Peterson
相关产品推荐
相关产品推荐

