Node.js 快速验证器:销毁嵌套对象是痛苦的-有更好的方法吗?
我正在使用nodejs/mongoDB/mongoose/express验证器,并试图通过validationResult(req)输出错误消息。据我所知,这将返回一个嵌套对象,然后我必须销毁该对象才能访问消息 编辑:这是express validator 4.x版(2017年9月),因此我找不到更好的文档/教程。。。目前所有可用的图坦卡蒙指的是不再有效的方法Node.js 快速验证器:销毁嵌套对象是痛苦的-有更好的方法吗?,node.js,express,express-validator,Node.js,Express,Express Validator,我正在使用nodejs/mongoDB/mongoose/express验证器,并试图通过validationResult(req)输出错误消息。据我所知,这将返回一个嵌套对象,然后我必须销毁该对象才能访问消息 编辑:这是express validator 4.x版(2017年9月),因此我找不到更好的文档/教程。。。目前所有可用的图坦卡蒙指的是不再有效的方法 app.post("/register", check("username").isEmail().withMessage("Ungül
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就会崩溃
是否有更好的方法来创建仅包含现有错误消息的数组
谢谢!
Philip首先,如果要检查是否存在错误,则必须使用以下方法: 从上面的代码来看,您似乎在寻找将errors对象更改为消息数组,以便在视图中显示它们。另一种方法是将映射对象发送到视图,然后根据字段名检查是否存在错误,例如: 路由处理程序:
var errors = validationResult(req);
if ( errors.isEmpty() ) {
res.redirect("/register");
} else {
res.render("register", {
title: "Register",
errors: errors.mapped();
});
}
视图(使用ejs视图引擎的示例)
然后,您可以从视图中迭代错误数组,并在列表中显示所有错误,例如:
<ul>
<% for ( var i = 0; i < errors.length; i++ ) { %>
<li>field: <%= errors[i].param %>, Error message: <%= errors[i].msg %></li>
<% } %>
</ul>
- 字段:,错误消息:
您可以使用if
语句来测试存在什么,而不是让它抛出您必须捕获的异常。谢谢-但从我的观点来看,这将导致相同的结果。。。我必须为每一条可能的错误信息写一个声明。你觉得呢?我不明白你在期待什么。您可以使用一个try/catch来捕获所有错误,也可以使用if
测试每个错误。这是您的两个选择。我想知道是否有可能只捕获嵌套对象中的msg值,并将它们放入数组中进行迭代。我的错!我不清楚。你知道实现这一目标的方法吗?ThxWell,,您可以在任何对象上使用Object.keys(obj)
,这将获得存在的可枚举属性列表,然后您可以对它们进行迭代。或者,如果您试图做的事情比这更复杂,您可以编写一个小实用程序函数,从任何复杂的结构中获取任意内容的数组。如果你展示了一个错误看起来像什么的例子(什么东西有时在那里,有时不在那里),这将使提供更具体的想法变得更容易。这非常有效-谢谢!是否有可能检查“msg”属性并将它们输出到一个新数组中,这样我就可以迭代它而不是模板化每个可能的错误消息?谢谢@F LA,我编辑了我的答案,请看一看,如果它为你工作,也为未来读者感谢一千次!这正是我想要的:——)
<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>
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>