如何将Connect的中间件中的变量传递到app.get-action?

YMM*_*MMD 13 middleware node.js express

我想创建一种前置过滤器,它允许我在所有操作中使当前用户可用.followint方法运行良好,我甚至不需要声明一个全局变量:

app.use(function(req, res, next){
    if(req.session.user_id){
        /* Get user from database
           and share it in a variable
           that can be accessed frooom ...
        */
        User.find({ /* ... */ }, function(err, users){
            if(users.length == 1){
                req.current_user = users[0];
            }
            next();
        });
    }
    else{
        next();
    }
});

app.get('/', function(req, res){
    // ... here!!
    console.log(req.current_user);
    res.render('index', {
        current_user: req.current_user,
    });
});
Run Code Online (Sandbox Code Playgroud)

但是我仍然不确定是否可以操纵,req因为我不知道改变一些不属于我的东西是否正确?有一个更好的方法吗?

Jar*_*son 21

继续前进,坚持属性req!当我第一次开始使用Node.js和JavaScript时,这对我来说也很奇怪(来自主要的C++背景).然而,鉴于JavaScript的原型对象模型,这是很自然的.在你熟悉它之后,你会发现你可以用简洁的代码做强大的事情.

我是Passport的开发者(前一位评论者提到).如果您计划开发可以跨应用程序重用的中间件,我的建议是关注您如何命名您添加的属性,reqres避免与同一应用程序中的其他中间件发生任何潜在冲突.

例如,Passport设置userat req.user,但是提供了一个更改它的选项(例如,应用程序可以说将其设置req.currentUser为.).内部私有变量附加​​到req._passport属性.


250*_*50R 7

这是使用会话或用户对象扩展req的常用方法

例如,请参阅以下示例: