Mic*_*ala 3 express express-validator
我正在尝试使用 express-validator 来验证 req.body,然后再发送将数据插入到 postgres 的 post 请求。
我有一个路由文件、控制器文件,我想在一个名为 validate.js 的文件中执行验证。同时,我已经安装了 express-validator 并在我的 server.js 中导入了它。我遇到的其他资源似乎在包含插入数据的逻辑的函数中实现了验证。
//server.js
....
import expressValidator from 'express-validator';
...
app.use(bodyParser.urlencoded({ extended: false }));
app.use(expressValidator);
Run Code Online (Sandbox Code Playgroud)
//route.js
import express from 'express';
import usersController from './controller';
const router = express.Router();
router.post('/createuser', usersController.createUser);
Run Code Online (Sandbox Code Playgroud)
//controller.js
createUser(req, res){
// ...
const { firstName, lastName, email, password } = req.body;
//code to insert user details to the database
}
Run Code Online (Sandbox Code Playgroud)
//validator.js
import { check } from 'express-validator/check';
module.exports = [check('email').isEmail()];
Run Code Online (Sandbox Code Playgroud)
我希望在名为 validator.js 的文件中实现验证,例如,在插入数据库之前验证电子邮件
Shi*_*rma 29
我有相同的方法,除了一件事是我们不应该在控制器中处理验证错误。因此,如果验证层发生任何错误,它应该只从那里返回。我们不应该让我们的控制流进入控制器层。所以下面是代码示例:
使用路由.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;
Run Code Online (Sandbox Code Playgroud)
用户验证器.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();
},
];
Run Code Online (Sandbox Code Playgroud)
控制器.js
/**
* @desc - create new User
* @method - POST
*/
exports.createCategory = async (req, res) => {
// do your stuff here. (No need to check any validation error here)
}
Run Code Online (Sandbox Code Playgroud)
这是我使用 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];
Run Code Online (Sandbox Code Playgroud)
现在在你的路由文件中你需要 validator.js 文件
const validator = require("./validator"); // or where your file is located
并使用你想要的验证逻辑作为中间件。例如:
route.js
//
router.post('/createuser', validator.createUser, usersController.createUser);
Run Code Online (Sandbox Code Playgroud)
最后,在您的控制器中,您必须在需要validationResult.
控制器.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.
}
Run Code Online (Sandbox Code Playgroud)
此外,您不必app.use(expressValidator);在 server.js 文件中使用
我在异步函数方面遇到了一些问题,这是我简陋的解决方案,希望这对某人有所帮助:
路线定义
const router = require('express').Router();
const userValidator = require('./Validators/UserValidator');
const userController = require('./Controllers/UserController');
router.post('/users', userValidator.add, userController.add);
Run Code Online (Sandbox Code Playgroud)
验证器
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
]
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9010 次 |
| 最近记录: |