13

我想创建一种之前的过滤器,它允许我让当前用户在所有操作中都可用。以下方法效果很好,我什至不需要声明全局变量:

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,
    });
});

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

4

2 回答 2

21

继续前进并添加属性req!当我第一次开始使用 Node.js 和 JavaScript 时,我也觉得这很奇怪(主要来自 C++ 背景)。然而,考虑到 JavaScript 的原型对象模型,这很自然。在你熟悉它之后,你会意识到你可以用简洁的代码做强大的事情。

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

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

于 2012-05-02T15:12:09.357 回答
7

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

例如,请参阅以下示例:

于 2012-05-02T11:09:49.123 回答