处理express-validator的customSanitizer错误?

问题描述 投票:0回答:1

我正在使用

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

的响应
express express-validator
1个回答
0
投票

回复有点晚了,但我也遇到了同样的问题。

我最终做的是根据此处的示例编写自定义验证运行中间件函数:

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);
      }
    };
  }
© www.soinside.com 2019 - 2024. All rights reserved.