快速验证快速验证器不显示错误



我确信这不是问题,相反,我没有以正确的方式使用它。

我想验证用户请求主体,根据文档,所有工作都在路由文件中完成。我把我的工作分成了路由和控制器文件。我通过了一个验证中间件,它需要验证,但没有。介于两者之间的问题。

我的路线是:

router.post(
'/signup',
userController.validateRequest,
userController.hashPassword,
userController.signup
);

相反,如果我这样做:

router.post(
'/signup',
body('email').isEmail().withMessage('Please enter a valid email'),
body('password')
.equals('confirmPassword')
.withMessage('Passwords do not match'), 
userController.hashPassword,
userController.signup
);

这将起作用但如果存在多个验证请求,这将使代码变得混乱。

我只想知道,如果我将请求和验证中间件分开,或者我必须在路由文件ONLY中通过验证,正确的方法是什么。如果我做得不对,请纠正我。

我的验证中间件是:

exports.validateRequest = (req, res, next) => {
if (req.body.email) {
body('email').isEmail().withMessage('Please enter a valid email');
}
if (req.body.password_confirm) {
body('password')
.equals('confirmPassword')
.withMessage('Passwords do not match');
}
next();
};

我的控制器,所有错误消息都显示

exports.signup = async (req, res) => {
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({ errors: errors.array() });
}
............

我更喜欢Joi最强大的验证器

async createAccountSchema(req, res, next) {
// create schema object
const schema = Joi.object({
email: Joi.string().email().required(),
password: Joi.string()
.min(8)
.required(),
confirmPassword: Joi.string()
.valid(Joi.ref('password'))
.required()
.label('Passwords')
.messages({ 'any.only': '{{#label}} are not the same' }),
})
// schema options
const options = {
abortEarly: false, // include all errors
allowUnknown: true, // ignore unknown props
stripUnknown: true, // remove unknown props
}
// validate request body against schema
const result = schema.validate(req.body, options)
if (result.error) {
return res.status(400).json(result.error.details)
} else {
result.value.email = result.value.email.trim().toLowerCase()
result.value.password = result.value.password
req.body = result.value
next()
}
}

这是验证器的一个例子。您将req.body传递给验证器,它就完成了这项工作。

验证后,将req.body设置为验证结果并使用next()

app.use("/", createAccountSchema, userController.signup)

最新更新