【问题标题】:Retreive session information in nodejs / express without request variable在没有请求变量的情况下检索节点 js / express 中的会话信息
【发布时间】:2018-02-06 02:40:02
【问题描述】:

如果我使用express-session,会话变量在req.session 下可用,例如:

 app.get('/', function(req, res) {
      req.session.myVar = 1;
 }

但是,如果我想检索深度嵌套在我没有可用的req 变量的应用程序中的当前请求会话怎么办?

除了将req 变量作为参数传入整个框架之外,还有其他方法吗?

【问题讨论】:

  • 可以全局存储
  • @RahulSharma - 您不能在全球范围内存储它。这将混合来自不同用户和请求的数据。
  • @Flion 这引出了一个问题,如果函数离请求那么远,为什么需要它?一个深层嵌套的方法应该关心用户身份还是应该由更上一层的层来处理......
  • @UsmanMutawakil,它涉及处理多个域的nodejs http服务器,我需要更深入地了解原始请求来自哪个域的代码。

标签: javascript node.js express session


【解决方案1】:

除了将 req 变量作为参数传入整个框架之外,还有其他方法吗?

不,不是真的。一个 node.js 服务器(使用任何异步操作)可以同时处理多个请求。因此,您要访问的任何特定于请求的数据都必须来自与此特定请求关联的对象,并且仅来自与此特定请求相关联的对象。你不能把它放在全局变量中,因为它们可以从不同的请求中混合。你有几个选择,但最终你必须通过你的函数将数据传递到需要的地方——这里没有捷径。这里有几个选项:

  1. 将数据放在req 上,并通过您的代码将req 传递给需要数据的函数。
  2. 传递数据本身(如果您只需要一次数据,则无需传递整个req 对象。
  3. 创建一个特定于该特定请求的新对象(不与其他请求共享或可供其他请求使用)并将所需数据作为属性放在该对象上,然后将该对象传递给所需的代码。在 OO 世界中,您通常可以将多个函数作为方法放在一个共享对象上,然后这些数据会自动提供给所有这些方法,因此您不必显式传递它。
  4. 使用共享作用域和闭包,以便任何需要访问数据的函数都可以直接从父作用域获取数据。

【讨论】:

    【解决方案2】:

    对我来说,解决方案是使用Continuation-local-storage 作为中间件来表达这个问题中概述的类似NodeJS TransactionID with Continuation-local-storage

        import * as cls from "continuation-local-storage";
    
        cls.createNamespace('mynamespace');
        app.use((req, res, next) => {
            let session = cls.getNamespace('mynamespace');
            session.bindEmitter(req);
            session.bindEmitter(res);
    
            session.run(function() {
                session.set('req', req);
                next();
            });
        });
    

    当您以后需要时:

        var session = cls.getNamespace('mynamespace');
        var req = session.get('req');
    

    【讨论】:

    • 我必须使用创建的命名空间来调用 bindEmitter()。由于某些奇怪的原因 getNamespace() 没有做到这一点。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2016-08-02
    • 1970-01-01
    • 2015-11-08
    • 1970-01-01
    • 1970-01-01
    • 2020-09-28
    • 1970-01-01
    • 2014-07-02
    相关资源
    最近更新 更多