我正在使用nodejs / mongoDB / mongoose / express-validator,我试图通过validationResult(req)输出错误消息。我的理解是,这会返回一个嵌套对象,然后我必须对其进行破坏才能访问这些消息。
编辑:它的快速验证器版本4.x(2017年9月)这就是为什么我找不到更好的文档/教程...所有当前可用的tuts指的是哪些方法不再工作了。
app.post("/register",
check("username").isEmail().withMessage("Ungültige E-Mailadresse"),
check("password").isLength({ min: 4 }).withMessage("Ungültiges Passwort"),
check("password").equals("password-repeat").withMessage("Passwort stimmt nicht überein"),
function (req, res) {
var errors = validationResult(req).mapped();
if (errors) {
try {
var { username: { msg: username_error } } = errors;
} catch(e) {
console.log("Undefined shit u so");
}
try {
var { password: { msg: password_error } } = errors;
} catch(e) {
console.log("Undefined shit u so");
}
var messages = [username_error, password_error];
res.render("register", {
title: "Register",
errors: messages
})
} else {
res.redirect("/register");
}
})
上面的代码有效,但很痛苦......如果我不尝试/捕获每个可能的TypeError(无法破坏undefined或null),nodejs会崩溃。
有没有更好的方法来创建只包含现有错误消息的数组?
谢谢! 菲利普
答案 0 :(得分:2)
首先,如果您想检查错误是否存在,那么您必须使用.isEmpty()方法:
var errors = validationResult(req);
if ( errors.isEmpty() ) {
res.redirect("/register");
} else {
// send validation messages
}
从上面的代码中,您似乎正在寻找将errors对象更改为消息数组以在视图中显示它们。另一种方法是将映射的对象发送到您的视图,然后根据字段名称检查错误是否存在,这是一个例子:
路由处理程序:
var errors = validationResult(req);
if ( errors.isEmpty() ) {
res.redirect("/register");
} else {
res.render("register", {
title: "Register",
errors: errors.mapped();
});
}
查看(使用ejs视图引擎的示例)
<div>
<input name="username" type="text">
<!-- check if there is any errors related to username input -->
<% if ( errors.hasOwnProperty('username') ) { %>
<span class="error"> <%= errors.username.msg %> </span>
<% } %>
</div>
<div>
<input name="password" type="password">
<!-- check if there is any errors related to username input -->
<% if ( errors.hasOwnProperty('password') ) { %>
<span class="error"> <%= errors.password.msg %> </span>
<% } %>
</div>
请记住,mapped()
方法返回一个对象,其中键是字段名称,值是验证错误
编辑如果您想将错误呈现为数组,请使用.array()方法:
res.render("register", {
title: "Register",
errors: errors.array({ onlyFirstError: true });
});
然后,您可以从视图中迭代错误数组并显示列表中的所有错误,例如:
<ul>
<% for ( var i = 0; i < errors.length; i++ ) { %>
<li>field: <%= errors[i].param %>, Error message: <%= errors[i].msg %></li>
<% } %>
</ul>