Express Validator:销毁嵌套对象很痛苦——有更好的方法吗?

Express Validator: Destruction of nested object is painful - is there a better way?

我正在使用 nodejs/mongoDB/mongoose/express-validator 并尝试通过 validationResult(req) 输出错误消息。据我了解,此 returns 是一个嵌套对象,然后我必须对其进行破坏才能访问消息。

编辑:它是快速验证器版本 4.x(2017 年 9 月),这就是为什么我找不到更好的 documentation/tutorials ...所有当前可用的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");
    }
})

上面的代码有效但很痛苦...如果我不try/catch所有可能的 TypeError(无法破坏未定义或 null),nodejs 会崩溃。

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

谢谢! 菲利普

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

var errors = validationResult(req);

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

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

路由处理器:

var errors = validationResult(req);

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

View(使用 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() 方法 return 一个对象,其中键是字段名称,值是验证错误

EDIT 如果你想将错误渲染为数组然后使用 .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>