我刚开始使用带有express-validator的express.js来验证一些输入数据,并且我在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方法的最终回调函数中的字段。
// ./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方法的最终回调之前将检查函数作为函数数组传递,如下所示:
// ./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,因此无效。所以我的问题是:我如何访问check()
链中的请求对象,以使用新的express-validator API比较两个不同的字段?非常感谢提前!
答案 0 :(得分:20)
在摆弄了一段时间之后,我找到了一种通过使用自定义验证器来实现此目的的方法。传递给自定义方法的验证器函数接受包含请求正文的对象:
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
});