我正在尝试使用express-validator验证req.body,然后再发送将数据插入postgres的发布请求。
我有一个路由文件,控制器文件,我想在一个名为validate.js的文件中进行验证。同时,我安装了express-validator并将其导入到server.js中。我遇到的其他资源似乎在包含插入数据逻辑的函数中实现了验证。
//server.js
....
import expressValidator from 'express-validator';
...
app.use(bodyParser.urlencoded({ extended: false }));
app.use(expressValidator);
//route.js
import express from 'express';
import usersController from './controller';
const router = express.Router();
router.post('/createuser', usersController.createUser);
//controller.js
createUser(req, res){
...
const { firstName, lastName, email, password } = req.body;
//code to insert user details to the database
}
//validator.js
import { check } from 'express-validator/check';
module.exports = [check('email').isEmail()];
我希望在一个名为validateator.js的文件中实现验证,以便在插入数据库之前验证电子邮件
答案 0 :(得分:15)
我有相同的方法,除了一件事是我们不应该在控制器中处理验证错误。因此,如果验证层发生任何错误,则应仅从那里返回。我们不应该允许我们的控制流进入控制器层。因此,下面是代码示例:
useRoute.js
def create(event):
new_window_2 = Toplevel(window)
new_window_2.geometry('500x600')
owner_comb_data = tk.StringVar()
owner_combo = ttk.Combobox(new_window_2,width = 20,textvariable = owner_comb_data, values = owners)
owner_combo.set("OWNER")
owner_combo.grid(column = 1, row =1, padx=10,pady=10)
userValidator.js
const route = express.Router();
const {
**validateUser**,
} = require('../middlewares/validators/userValidator');
route.route('/').post(**validateUser**, createUser);
route.route('/:id').put(**validateUser**, updateUser);
module.exports = route;
controller.js
const {check, validationResult} = require('express-validator');
exports.validateUser = [
check('name')
.trim()
.escape()
.not()
.isEmpty()
.withMessage('User name can not be empty!')
.bail()
.isLength({min: 3})
.withMessage('Minimum 3 characters required!')
.bail(),
check('email')
.trim()
.normalizeEmail()
.not()
.isEmpty()
.withMessage('Invalid email address!')
.bail(),
(req, res, next) => {
const errors = validationResult(req);
if (!errors.isEmpty())
return res.status(422).json({errors: errors.array()});
next();
},
];
答案 1 :(得分:0)
这是我使用express-validator的方式。我有一个文件validator.js
,其中有许多路由的验证逻辑。例如:
validator.js
const { check } = require('express-validator/check');
exports.createUser = [check('email').isEmail()];
exports.anotherRoute = [// check data];
exports.doSomethingElse = [// check data];
现在在您的路由文件中,您需要validator.js文件
const validator = require("./validator"); // or where your file is located
并将所需的验证逻辑用作中间件。例如:
route.js
//
router.post('/createuser', validator.createUser, usersController.createUser);
最后,在需要validationResult
之后,您必须在控制器内部检查在验证期间创建的可能错误。
controller.js
const { validationResult } = require('express-validator/check');
exports.createUser(req, res) {
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(422).json({ errors: errors.array() });
}
// do stuff here.
}
此外,您不必在server.js文件中使用app.use(expressValidator);
答案 2 :(得分:0)
我在使用异步功能时遇到了一些问题,这是我的谦虚解决方案,希望对您有所帮助:
路由定义
const router = require('express').Router();
const userValidator = require('./Validators/UserValidator');
const userController = require('./Controllers/UserController');
router.post('/users', userValidator.add, userController.add);
验证者
const { check, validationResult } = require('express-validator');
const generateValidators = () => [
check('first_name')...,
check('last_name')...,
check('email')...,
check('password')...
]
const reporter = (req, res, next) => {
const errors = validationResult(req);
if (!errors.isEmpty()) {
const errorMessages = errors.array().map(error => error.msg);
return res.status(400).json({
errors: errorMessages
});
}
next();
}
module.exports = {
add: [
generateValidators(),
reporter
]
};