2015-09-11 3 views
0

В воображаемом модуле сеанса, как показано ниже, может быть пропущена переменная _sessData между запросами. Например, может быть, пользователь только что вошел в систему, и в то же время вызываемый isAuthed() создается для другого пользователя. Это может быть проблема? Этот модуль будет вызываться по каждому запросу, поэтому я думаю, что это безопасно, но подтверждение было бы замечательным.Узел/commonJS может «закрывать» переменную утечку между запросами

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

} 

EDIT:

Модуль привыкают в приложении KoaJS как так (выше модуль не производит должного KoaJS промежуточное программное обеспечение, но это рядом с точкой):

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

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

app.listen(3080); 
+0

Как вы это называете для каждого отдельного пользователя/запроса? – jfriend00

+0

@ jfriend00 Фактическая реализация выполняется в промежуточном программном обеспечении KoaJS. Поэтому он использует view 'app.use (..)' из файла начальной загрузки – silkAdmin

+0

Это не объясняет это вообще. Этот модуль называется отдельно для каждого нового запроса, поэтому для каждого запроса создается новый объект сеанса или есть только один объект Session, который используется всеми запросами. – jfriend00

ответ

0

Что вы экспортируете, является функцией, поэтому _sessData фактически не существует при импорте модуля. Он создается при вызове функции. Каждый раз, когда вызывается функция, и ее нужно вызывать один раз для каждого запроса, создается новая переменная в этой области с именем _sessData. Нет, они не могут мешать друг другу.