2014-02-13 102 views
1

我正在使用護照來驗證我的用戶,這是沒有問題的。我的問題包括傳遞請求的每個頁面 一些要求的參數。傳遞參數爲每個請求

有一些方法來完成它:

  • 使用app.locals存儲變量,但它可用於連接和 不必要的信息將共享每個用戶,這是一個風險。
  • 當渲染一個頁面res.render('some_page', { params });時,您也必須爲每個請求添加這些額外的參數 。對象在發送之前會被修改。

我使用第二種方法,並做到這一點我做了這樣的全局函數:

GLOBAL.handleRes = function(req, data) { 
    data.session = req.session; 
    data.user = req.user; 
    data.userToken = req.userToken; 

    if (req.user && req.session) { 
     data.session.user = req.user; 
    } 

    return data; 
} 

因此,對於每個註冊route,我已經使用這個handleRes建立起來的最終的JSON將會被髮送到頁面 。

例子:

app.get('/project/list', function(req, res, next) { 
    // DO SOMETHING 
    var pageJson = { 
     ... 
    } 

    res.render('project_list.ejs', { handleRes(res, pageJson) }); 
}; 

app.get('/another/route', function(req, res, next) { 
    // SAME STRUCTURE FROM ABOVE 
    res.render('another_route.ejs', { handleRes(res, pageJson) }); 
} 

它的工作原理,但我想避免handleRes()功能的這種計算策略,並快速自動「完成」我的json參數。我如何使 更容易,更簡潔,更優雅?

謝謝!

##修訂##

安德烈亞斯幫助我解決的辦法是:

app.use(function(req, res, next) { 
    res.locals.user = null; 
    res.locals.session = null; 
    res.locals.userToken = null; 

    if (req.user) 
     res.locals.user = req.user; 

    if (req.session) { 
     res.locals.session = req.session; 
     if (req.user) 
      res.locals.session.user = req.user; 
    } 

    if (req.userToken) 
     res.locals.userToken = req.userToken; 

    next(); 
}); 

回答

0

一個共同的和AFAIK最好的辦法是路由,你設置之前,把中間件默認屬性res.locals。 Express會自動擴展這個對象(並且如果有任何設置,則擴展app.locals),並將任何數據發送到res.render()。例如:

// Put this before app.use(app.router) or any routes 
app.use(function (req, res, next) { 
    res.locals = { 
    one: 1, 
    two: 2 
    }; 

    next(); 
}); 

// ... 

app.get('/', function (req, res) { 
    res.render('view', { 
    two: 3 
    }); 
    // Will render the view with { one: 1, two: 3 } 
}); 
+0

我之前正在考慮使用中間件,但我不知道如何使它工作。我想到了一些關於路由攔截器的東西。謝謝 – Ito