使用 Express 和 Node 将值传回以由 Jade 呈现

Passing values back to be rendered by Jade, using Express and Node

我昨天问了一个问题,但我一直在继续。我没有调用 next() 并传递一个 Error 对象,而是弄清楚它在做什么,并尝试复制它。现在,当有人登录失败时,我这样做:

   res.render("pages/home", 
            {
                flash:{"danger":["Login failed. Please enter your details and try again."]},
                body:{},
                section:"home",
                locals : { userId : req.body.email } 
            }

这与旧代码的作用完全相同。我单步执行它,我可以看到 locals 对象包含一个名为 userId 的 属性,具有我期望的值。在 Jade 模板中,我有这个:

    p it's #{typeof(userId)}
    if(typeof(userId) != 'undefined')
        p Welcome #{userId}
        input(type='text', name='email', id="inputEmail", placeholder="Email", value="#{userId}")
    else
        input(type='text', name='email', id="inputEmail", placeholder="Email", value="")

这总是呈现为“未定义”,然后是一个空文本框。我已经阅读了几个关于此的问题,据我所知,他们都说了同样的话:如果我将 locals 设置为 JSON 对象,我可以通过这种语法访问它的属性,但它不会工作。

我做错了什么?

OK - 事实证明 'locals' 不再有任何意义。保持我的代码不变,我需要访问 'locals.userId',但我可以只设置 'userId' 的值而根本没有 'locals' 对象。

您可能首先需要更好地理解 locals 对象的实际工作原理。

在服务器端,这样做:

res.render('view', { property: 'value' } );

将使 property 在您的视图中可用,如下所示:

div Value = #{property}

您也可以通过以下方式达到同样的效果:

res.locals.property = 'value';
res.render('views');

注意 locals 对象的用法。 More info


回到你的问题,因为你有

res.render("pages/home", { locals: { userId : req.body.email } })

访问 userId 在这种情况下你会做:

p Welcome #{locals.userId}

所以我猜你混淆了两种最终使用 locals 对象的错误方法。