将数据从路由处理程序传递到jade模板

时间:2014-03-09 21:44:38

标签: node.js express pug

我正在组建一个基本的项目管理/管理站点,并决定最终学会使用node / express / monk / jade / redis,这些作品。一切都很顺利,但我遇到了一个问题,试图在index.js中的路由处理程序和jade模板文件之间传递数据。

index.js

中的

exports.auth = function( db )
{

    return function( req, res )
    {

        var userName      = req.body.username,
            userPassword  = req.body.password,
            authenticated = false;

        // check credentials code
        // ...

        if (authenticated)
        {
            // set some session stuff
            res.redirect( "home" );  // good to go
        }
        else
        {
            res.locals.err = "Authentication error";
            res.redirect( "login" );  // show err on login page
        }

    }
}
login.jade

中的

- if (typeof( locals.err ) !== 'undefined' ) {
    p.errormsg #{ locals.err }
- }

在jade模板中迭代locals,它不会显示err的条目。 res.redirect()是否会清除我在index.js中输入的错误条目?或者我实际上是在处理两个不同的对象(res.locals中的index.js和jade模板中的locals

我原来的方法是使用res.render( "login", { "err" : "Authentication err" } )而不是重定向,但我无法弄清楚当错误发生时如何让浏览器显示/login而不显示/auth。我试过了

res.location( "login" );
res.render( "login", { "err" : "Authentication err" });

但浏览器仍显示/auth

我发现的唯一其他方法是使用会话数据。会话对象在两个地方都可用,我可以根据需要设置/读取信息。虽然会话信息通过重新加载登录页面而持续存在,但是浏览器只是继续显示原始尝试的错误消息而不是重新加载/呈现干净的登录页面。

感谢任何帮助,并提前感谢!

1 个答案:

答案 0 :(得分:0)

是 - 重定向正在向客户端返回重定向,从而向客户端发出单独的请求。您之前的res.locals.err早已不复存在。您可能需要阅读doc on res.redirect()

除非你是关于无国籍状态的核心,否则会话数据将是处理这种情况的明智方式。我不确定你为什么觉得它不优雅。在渲染下一页后,为什么不重置会话数据的元素?

如果您搜索某些javascript,有不同的方法可以处理有关位置栏显示内容的问题。虽然感觉有点像kludge。

就个人而言,我只有/login路径 - 通过GET调用它显示登录页面,通过POST调用它进行身份验证,如果成功则重定向,或者使用以下方式呈现登录模板如果登录错误,则会出错。没有必要的会话数据。