gpt4 book ai didi

node.js - 快速验证器 : Destruction of nested object is painful - is there a better way?

转载 作者:太空宇宙 更新时间:2023-11-03 23:00:49 26 4
gpt4 key购买 nike

我正在使用nodejs/mongoDB/mongoose/express-validator,我试图通过validationResult(req)输出错误消息。据我了解,这会返回一个嵌套对象,然后我必须破坏该对象才能访问消息。

编辑:它是 Express-validator 版本 4.x(2017 年 9 月),这就是为什么我找不到更好的文档/教程...所有当前可用的教程都引用了不起作用的方法不再了。

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 就会崩溃。

是否有更好的方法来创建仅包含现有错误消息的数组?

谢谢!菲利普

最佳答案

首先,如果你想检查是否存在错误,那么你必须使用 .isEmpty()方法:

var errors = validationResult(req);

if ( errors.isEmpty() ) {
res.redirect("/register");
} else {
// send validation messages
}

从上面的代码来看,您似乎正在寻找将错误对象更改为消息数组以在 View 中显示它们。另一种方法是将映射的对象发送到您的 View ,然后根据字段名称检查是否存在错误,下面是一个示例:

路由处理程序:

var errors = validationResult(req);

if ( errors.isEmpty() ) {
res.redirect("/register");
} else {
res.render("register", {
title: "Register",
errors: errors.mapped();
});
}

View (使用 ejs View 引擎的示例)

<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 });
});

然后,您可以从 View 中迭代错误数组并在列表中显示所有错误,例如:

<ul>
<% for ( var i = 0; i < errors.length; i++ ) { %>
<li>field: <%= errors[i].param %>, Error message: <%= errors[i].msg %></li>
<% } %>
</ul>

关于node.js - 快速验证器 : Destruction of nested object is painful - is there a better way?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48603333/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com