2014-02-13 103 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