Express-Validator "validationResult" returns [object 对象]

Express-Validator "validationResult" returns [object Object]

我正在修改 Express-Validator 中间件的错误处理以通过我的自定义错误处理中间件,但是 validationResult 的消息解析为 [object Object]

Express-Validator 错误处理

const expressValidationError = (req, res, next) => {
  const errors = validationResult(req);

  if (!errors.isEmpty()) {
    const err = new Error(errors.array());
    err.status = 400;
    next(err);
  } else {
    next();
  }
};

Express 错误处理中间件

app.use((err, req, res, next) => {
  const status = err.status || 500;
  res.status(status).json({
    error: {
      status: status,
      message: err.message || "Internal Server Error",
    },
  });
});

这是从 validationResult 返回的 error 对象的结果:

Result {
  formatter: [Function: formatter],
  errors: [
    {
      value: 'b',
      msg: 'Username Must be Between 5 to 255 Characters Long!',
      param: 'username',
      location: 'body'
    }
  ]
}

这是errors.array():

[
  {
    value: 'b',
    msg: 'Username Must be Between 5 to 255 Characters Long!',
    param: 'username',
    location: 'body'
  }
]

我知道我可以在 Express-Validator 中使用 res.status(400).json({ error: errors.array() }); 并避免所有这些,但我更愿意将其传递给 next() 并由错误中间件处理。

有什么方法可以这样做还是我应该换一种方式?

如果你看到下面的代码,这就是正在发生的事情。您正在传递一个对象数组。

let status = new Error([{}]);
console.log(status); // Error: [object Object]

现在,当您检查验证对象时,它是这样的:

// errors will be like
[{ myLocation: 'body' }, { myLocation: 'query' }...]

所有你必须把它变成一个字符串:

const expressValidationError = (req, res, next) => {
  const errors = validationResult(req);

  if (!errors.isEmpty()) {

    // below is only useful when you don't have array of objects
    // const err = new Error(errors.array().toString());

    const err = new Error(errors.array().map(el => el['msg']).toString());
    err.status = 400;
    next(err);
  } else {
    next();
  }
};

添加哪个键有什么验证错误:

const expressValidationError = (req, res, next) => {
  const errors = validationResult(req);

  if (!errors.isEmpty()) {

    // below is only useful when you don't have array of objects
    // const err = new Error(errors.array().toString());

    const err = new Error(errors.array().map(el => `${el[param]} - has Error: ${el['msg']}`).toString());
    err.status = 400;
    next(err);
  } else {
    next();
  }
};

问题不在于验证器,而是 Error 对象将字符串参数作为第一个参数,而您向它传递的是一个对象(数组),因此是 object object

所以JSON.stringify对象:

const err = new Error(JSON.stringify(errors.array()));