在express-validator v4的检查function中访问请求主体

我刚开始使用express.js和express-validator来validation一些input数据,并且在版本4.0.0中引入的新的检查API中访问请求主体时遇到问题。

在较旧的版本中,您只需在body-parser后面的app.js中添加express-validator作为中间件:

// ./app.js const bodyParser = require("body-parser"); const expressValidator = require("express-validator"); const index = require("./routes/index"); const app = express(); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false })); app.use(expressValidator()); 

然后在我的索引路线中,我可以检查post方法的最终callback函数中的字段。

 // ./routes/index.js const express = require("express"); const router = express.Router(); router.post("/submit", (req, res, next) => { // check email req.check('email','Invalid email address').isEmail() // check if password is equal to password confirmation req.check('password', 'Invalid password') /* Access request body to compare password field with password confirmation field */ .equals(req.body.confirmPassword) // get errors const errors = req.validationErrors(); // do stuff }); 

就像在这个例子中,我可以很容易地检查我的密码字段和我的表单的密码确认字段的值是否相等。 然而,从版本4开始,他们有了一个新的API,它要求你直接在你的路由器文件中加载express-validator,然后在post方法中的最后一个callback之前把检查函数作为函数数组传递,如下所示:

 // ./routes/index.js const express = require("express"); const router = express.Router(); const { check, validationResult } = require("express-validator/check"); router.post( "/submit", [ // Check validity check("email", "Invalid email").isEmail(), // Does not work since req is not defined check("password", "invalid password").isLength({ min: 4 }) .equals(req.body.confirmPassword) // throws an error ], (req, res, next) => { // return validation results const errors = validationResult(req); // do stuff }); 

由于没有定义req,这是行不通的。 所以我的quetsion是:我如何访问check()链中的请求对象来比较两个不同的领域与新的express-validator API? 首先十分感谢!

经过一段时间的摆弄之后,我find了一个通过使用自定义validation器来达到这个目的的方法。 传递给自定义方法的validation器函数接受包含请求主体的对象:

 router.post( "/submit", [ // Check validity check("email", "Invalid email").isEmail(), check("password", "invalid password") .isLength({ min: 4 }) .custom((value,{req, loc, path}) => { if (value !== req.body.confirmPassword) { // trow error if passwords do not match throw new Error("Passwords don't match"); } else { return value; } }) ], (req, res, next) => { // return validation results const errors = validationResult(req); // do stuff });