我正在使用
express-validator
进行服务器端验证。我收到了来自的 multipart/form-data
。因此,为此,我使用 formidable
。
因此,我创建了一个中间件
handleFormData
,它解析表单并将字段值附加到 req.body
对象。
exports.handleFormData = (req,res,next)=>{
const form = formidable({ multiples: true });
form.parse(req, (err, fields, files) => {
if(err){
return res.status(500).json({
status: false,
error: "Unable to process request. Try again"
})
}
req.body = fields
if(files.file){
req.body.file = files.file
}else{
req.body.file = {name:""}
}
next()
});
}
现在在表单中,我有一个字段
tags
,它将是一个字符串数组。所以我将从前端接收该数组作为 JSON string
。在验证之前,我想将其从 JSON string
转换为 array
。为此,我使用的是 customSanitizer
。现在我的问题来自前端,如果我收到无效的 JSON string
JSON.parse
将无法解析。如何处理该错误。
check("tags")
.customSanitizer(value => {
try {
return JSON.parse(value); // If value was invalid then JSON.parse will fail.
} catch (error) {
throw new Error("Invalid Tags")
}
})
.custom((values,{req})=>{
return tags.length > 0
})
所以我尝试使用
try catch
。如果 JSON.parse
失败,catch 块只会在 console
中抛出错误,但我想返回该错误作为对 user
的响应
回复有点晚了,但我也遇到了同样的问题。
我最终做的是根据此处的示例编写自定义验证运行中间件函数:
https://express-validator.github.io/docs/guides/manually-running
将其包装在 try-catch 中以捕获其他错误。
function validate(validations) {
return async function (req, res, next) {
try {
await Promise.all(validations.map((v) => v.run(req)));
const errors = validationResult(req);
if (errors.isEmpty()) {
return next();
}
// Handle validation error
return next(ex);
} catch (ex) {
// Catch the sanitizer error
return next(ex);
}
};
}