我在尝试express-validator v4.3.0时遇到问题 登录请求有一个基本的登录示例。电子邮件和密码有两个参数。以下是我的代码。
routes.js文件:
var express = require('express');
var router = express.Router();
var validator = require('./validator');
router.post('/login', [sanitize('email').trim(),
validator.publicRouteValidate('login')], (req, res, next) => {
console.log(req);
}
validator.js文件:
'use strict';
const { check, validationResult } = require('express-validator/check');
const { matchedData, sanitize } = require('express-validator/filter');
module.exports = {
publicRouteValidate: function (method) {
return (req, res, next) => {
switch (method) {
case 'login':
check('email').isEmail().withMessage('email must be an email')
.isLength({min: 109}).withMessage('minimum length should be 100 characters')
break;
}
var errors = validationResult(req)
console.log(errors.mapped())
if (!errors.isEmpty()) {
res.status(422).json({ errors: errors.array()[0].msg })
} else {
res.send('login')
}
}}}
现在,当我只使用电子邮件进行POST请求时,电子邮件的值为abc。所以我应该得到像电子邮件必须是电子邮件这样的错误。但我没有得到任何回应。那么我不知道的问题是什么?
答案 0 :(得分:3)
您的publicRouteValidate
函数仅创建验证程序,但永远不会被调用。
这是因为,如文档所述,check
会返回一个快速中间件。必须将此类中间件提供给快速路由才能完成其工作。
我建议你将这个功能分成两部分:一个用于创建验证器,另一个用于检查验证错误请求,在触摸路径之前提前返回。
router.post(
'/login',
createValidationFor('login'),
checkValidationResult,
(req, res, next) => {
res.json({ allGood: true });
}
);
function createValidationFor(route) {
switch (login) {
case 'login':
return [
check('email').isEmail().withMessage('must be an email'),
check('password').not().isEmpty().withMessage('some message')
];
default:
return [];
}
}
function checkValidationResult(req, res, next) {
const result = validationResult(req);
if (result.isEmpty()) {
return next();
}
res.status(422).json({ errors: result.array() });
}