簡體   English   中英

從 Jade 模板訪問 Express.js req 或 session

[英]Accessing Express.js req or session from Jade template

我想知道是否有一種簡單的方法可以從 Jade 模板中訪問 Express.js 的 req 或 session 變量,而無需通過正常響應傳遞它。

或者這是唯一的方法?

res.render('/', {
    session: req.session
});

只需添加

app.use(express.cookieParser());
app.use(express.session({secret: '1234567890QWERTY'}));
app.use(function(req,res,next){
    res.locals.session = req.session;
    next();
});

app.use(app.router);

並在翡翠中獲得您的 session

p #{session}

在 express 3.x 中,dynamicHelpers 已被刪除,因此您需要使用中間件和res.locals的組合。 假設我們想在/signup/new視圖中訪問req.query

localQuery = function(req, res, next) {
  res.locals.query = req.query;
  next();
};

newSignup = function(req, res) {
  res.render('signup/new');
};

app.get('signup/new', localQuery, newSignup);

現在,任何使用localQuery中間件的路由都將設置res.locals.query 然后可以在您的視圖中以query的形式訪問它。

您需要創建一個dynamicHelper供 Express 使用。

app.dynamicHelpers({
    session: function (req, res) {
        return req.session;
    }
});

然后在您的模板中,您可以使用<%= session.logged_in %>或其他任何東西。

注意:在 Express 3 中不推薦使用 dynamicHelper

只需使用中間件。

app.use(function (req, res, next) {
            var origRender = res.render;
            res.render = function (view, locals, callback) {
                if ('function' == typeof locals) {
                    callback = locals;
                    locals = undefined;
                }
                if (!locals) {
                    locals = {};
                }
                locals.req = req;
                origRender.call(res, view, locals, callback);
            };
            next();
});

之后,您可以使用“#{req}”在翡翠模板中引用它。

假設你在'req'中有一個'user' object,並且'user'有一個方法'isAnonymous',如果你的user.isAnonymous()返回true,

p #{req.user.isAnonymous()}

將呈現為:

<p>true</p>

這對我有用

app.use(function(req,res,next){
   res.locals.user = req.user;
   next();
});

在哈巴狗或翡翠視圖用戶

#{user.email}

您可以使用渲染 function 來解決此問題,您可以在其中渲染每個需要 session 變量作為模板中可訪問的局部變量的視圖(例如,通常在用戶登錄時)。

這是 function 的示例,但您可以隨意調整:

var renderView = function(res, template, context, session, cb) {
    context.session = session;

    if(cb){
        res.render(template, context, function(error, html){
            cb(error, html)
        }
    } else {
        res.render(template, context)
    }
}

然后可以這樣使用:

app.get("/url", function(req, res){

    req.session.user_email = user_email;

    renderView(res, "template_name", { local_variables: local_variables }, req.session)
});

在您的玉模板中,您可以像這樣訪問 session 變量:

div.user-email #{session.user_email}

雖然在 javascript 中總有一種方法可以逃離 scope 並向上爬行,但我真的真的真的真的非常非常強烈地鼓勵你找到另一種方法。

考慮一下您要問的問題:我可以讓我的觀點了解我的 controller 的膽量嗎?

或者你真正要問的是:我可以讓我的觀點了解我的運行時的膽量嗎?

視圖應該獲取數據並將其轉換為標記。 而已。 如果你做任何其他事情,你就做錯了。 我不在乎它有多“容易”。 這就是接口的意義所在。 准確定義正在傳遞的內容,並使其易於用另一件事替換一件事。

如果您的 session object 變量是全局聲明的,那么在全局

變體

在 function

sess=req.session

req.render('index.pug',{sess})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM