NodeJS 返回Joi外部验证错误和其他错误

o75abkj4  于 2023-04-20  发布在  Node.js
关注(0)|答案(1)|浏览(106)

我使用external()方法进行验证。我有自己的验证,检查登录是否存在于数据库中。但我自己的验证错误不会与其他方法一起返回
例如,如果password和confirmedPassword不匹配,Joi验证会通知这一点,但不会通知isLoginTaken。在纠正密码匹配后,将返回isLoginTaken错误
是否可以将所有错误一起返回?

自己的验证方法
const checkIsExistLogin = (login) => {
  const isLoginExist = UserModel.exists({ login }) 

  if (isLoginExist !== null) {
    throw new Joi.ValidationError(
      'string.login',
      [
        {
          message: 'login exist',
          path: ['login'],
          type: 'string.login',
          context: {
            key: 'login',
            label: 'login',
            login,
          },
        },
      ],
      login
    )
  }
}
导出并调用validateAsync函数
export const validateUser = (user) =>
  JoiSchema.validateAsync(user, { abortEarly: false })
路由控制器
router.post('/', async (req, res) => {
  try {
    await validateUser(req.body)

    let user = new User({
      name: req?.body?.name,
      lastName: req?.body?.lastName,
      birthDate: req?.body?.birthDate,
      pin: req?.body?.pin,
      adress: req?.body?.adress,
      login: req?.body?.login,
      password: req?.body?.password,
      passwordConfirmation: req?.body?.passwordConfirmation,
    })

    user = await user.save()

    return res.json({
      success: true,
      data: user,
      message: "You've added new user",
    })
  } catch (error) {
    return res.status(400).json({
      success: false,
      data: [],
      message: error,
    })
  }
})

我会很高兴任何提示。

z31licg0

z31licg01#

如果你想知道是否可以一起返回所有的错误,那么我有一个选项可以让你直接使用。
1.创建一个Map,其中包含您将抛出的所有错误:

const errorMap = new Map();

1.如果你的代码的某个部分给你一个错误,或者你想在那里抛出一个错误,那么把这个错误添加到Map中:
Contry/catch:

try {
    throw new Error("Hello");
} catch (e) {
    errorMap.set("HelloError",e);
}

Normal(在这种情况下,Joi也是一样的,只是使用error变量):

const HelloError = new Error("Hello");
errorMap.set("HelloError",HelloError);

1.一旦你完成了你的验证,那么你必须通过检查Map的大小来检查是否有任何错误,如果是这样的话,就像错误一样抛出它,然后在你想要显示错误的时候捕捉它:

try {
    if (errorMap.size > 0) {
        throw errorMap;
    }
} catch (e) {
    console.log(e);
}

1.现在,您可以对Map执行任何您想执行的操作,例如,抛出一条错误消息,该消息是您发现的验证错误列表。

相关问题