【问题标题】:How do I pass variables from Connect's middleware into app.get-action?如何将变量从 Connect 的中间件传递到 app.get-action?
【发布时间】:2012-05-02 10:45:13
【问题描述】:

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

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,因为我不知道更改不属于我的东西是否正确?有没有更好的方法来做到这一点?

【问题讨论】:

    标签: node.js express middleware


    【解决方案1】:

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

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

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

    【讨论】:

    • 只有我和我的队友需要使用它,所以在这种情况下,在两个不同的上下文中意外使用相同的属性名称的可能性不大。但是,尽管如此,您使名称可变的提示非常有用。也感谢您的回复!
    【解决方案2】:

    使用会话或用户对象扩展 req 是一种常用方法

    例如看这些例子:

    【讨论】:

      猜你喜欢
      • 2019-01-15
      • 2017-06-14
      • 2016-03-25
      • 2021-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-12
      • 1970-01-01
      相关资源
      最近更新 更多