Javascript Node/commonJS可以在请求之间“私有”变量泄漏

Javascript Node/commonJS可以在请求之间“私有”变量泄漏,javascript,node.js,commonjs,koa,Javascript,Node.js,Commonjs,Koa,在下面一个虚构的会话模块中,_sessData变量可能在请求之间泄漏。例如,可能有一个用户刚刚登录,同时为另一个用户进行了isAuthed调用。这可能是个问题吗?每个请求都会调用这个模块,所以我想这是安全的,但是确认一下就好了 module.exports = function(app) { var _sessData = null; function Session() { // } Session.prototype.set = funct

在下面一个虚构的会话模块中,_sessData变量可能在请求之间泄漏。例如,可能有一个用户刚刚登录,同时为另一个用户进行了isAuthed调用。这可能是个问题吗?每个请求都会调用这个模块,所以我想这是安全的,但是确认一下就好了

module.exports = function(app) {
    var _sessData = null;

    function Session() {
        //
    }

    Session.prototype.set = function( payload ) {
        Cookies.set('session', payload);
        _sessData = payload;
    }

    Session.prototype.isAuthed = function() {
        return _sessData && Object.keys(_sessData).length > 0;
    }

    Session.prototype.clear = function() {
        Cookies.set('session', '');
        _sessData = {};
    }

    Object.defineProperty(app.context, 'Session', {
        // Not exaclty sure what is happening here with this and _ctx..
        // Note: apprently ctx is bound to the middleware when call()ing
        get: function() { return new Session(this); }
    });

    return function * (next) {
        var token = Cookies.get('jwt');
        if ( ! token ) {
            _sessData = {};
            return yield* next;
        }

        try {
            _sessData = jwt.verify(token, SECRET);
        } catch(e) {
            if (e.name === 'TokenExpiredError') {
                this.Session.clear();
            }
        }
        yield* next;
    }

}
编辑:

该模块将在KoaJS应用程序中使用,例如,上述模块不会生成适当的KoaJS中间件,但这与重点无关:

var app = require('koa')();

// JWT session middleware
var session = require("./session")();
app.use(session);

app.listen(3080);

您正在导出的是一个函数,因此在导入模块时,数据实际上并不存在。它在调用函数时创建。每次调用函数时(每个请求需要调用一次),都会在该范围内创建一个名为_sessData的新变量。不,它们不能相互干扰。

对于每个单独的用户/请求,您如何调用它?@jfriend00实际的实现是在KoaJS中间件中进行的。所以它被用来查看应用程序。使用。。从引导文件中,根本无法解释它。是为每个新请求单独调用此模块,以便为每个请求创建一个新会话对象,还是所有请求只使用一个会话对象。@jfriend00我想这是模糊的部分。我已经用一些上下文更新了这个问题,关于如何调用这个模块。这更有意义吗?那代码看起来不太管用。var session=require./session;表示会话将是会话对象的实例。因此,使用app.usesession,您将一个会话对象传递给app.use,而不保存创建新会话对象的函数,这让我认为每个请求都有一个会话对象,这是一个严重的问题。