Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 快速验证器:销毁嵌套对象是痛苦的-有更好的方法吗?_Node.js_Express_Express Validator - Fatal编程技术网

Node.js 快速验证器:销毁嵌套对象是痛苦的-有更好的方法吗?

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

我正在使用nodejs/mongoDB/mongoose/express验证器,并试图通过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就会崩溃

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

谢谢!
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>