2017-02-08 14 views
0

Я пытаюсь включить сеансы только для некоторых маршрутов (те аутентификации), но у меня возникают проблемы, потому что страницы ошибок маршрутов:Экспресс Set Session для конкретных маршрутов

У меня есть это:

app.use(session({ 
     secret: config.secrets.session, 
     saveUninitialized: false, 
     resave: false, 
     store: sessionStore, 
     proxy: true, 
     cookie: { 
      maxAge: config.token_duration, 
      secure: false 
     } 
     // rolling: false 
    })); 


    app.use('/api/user', require('./api/user')); 
    app.use('/api/auth', require('./api/auth')); 

    app.route(['/error/500','/error/404','/user/settings']) 
     .get((req, res) => { 
      res.sendFile(path.resolve(app.get('appPath') + '/index.html')); 
     }); 

    app.route('/*/*') 
     .get(errors[404]);  

    app.use(errors[500]); 

Итак, если я использую его так, все страницы в моем приложении создадут сеанс (который я не хочу). Если я переведу секцию сеанса после маршрутов ошибок, я никогда не доберусь до маршрутов api, потому что он достигнет маршрута 404.

Заранее спасибо

ответ

1

Middleware может быть связан только с определенными маршрутами и порядком, в котором он задан вопросы. Существует несколько способов сделать это, и как наилучшим образом реализовать его, зависит от путей, используемых вашим сайтом, и того, как вы можете наиболее легко создать связь между путями и должен ли он иметь или не должен иметь промежуточное ПО сеанса.

Простейшей задачей было бы разместить обработчики маршрута ошибок перед вашим промежуточным программным обеспечением сеанса. Затем эти обработчики маршрута сначала обработают запрос, а промежуточное ПО сеанса никогда не будут вызваны.

app.route(['/error/500','/error/404','/user/settings']) 
    .get((req, res) => { 
     res.sendFile(path.resolve(app.get('appPath') + '/index.html')); 
    }); 

app.use(session({ 
    secret: config.secrets.session, 
    saveUninitialized: false, 
    resave: false, 
    store: sessionStore, 
    proxy: true, 
    cookie: { 
     maxAge: config.token_duration, 
     secure: false 
    } 
    // rolling: false 
})); 

Другие вещи, которые вы можете сделать:

  1. Помещенный путь на вашей сессии промежуточного слоя поэтому он вызывается только для определенных путей на вашем сайте (все прошедшие проверку подлинности страницы должны быть ниже этого пути).

  2. Создайте свой собственный обработчик промежуточного программного обеспечения, который проверяет, является ли путь /error, а если нет, то он вызывает обработчик промежуточного программного обеспечения сеанса. Если это /error, тогда не вызывайте промежуточное программное обеспечение сеанса.

Этот последний можно было бы сделать так:

const sessionHandler = session({ 
    secret: config.secrets.session, 
    saveUninitialized: false, 
    resave: false, 
    store: sessionStore, 
    proxy: true, 
    cookie: { 
     maxAge: config.token_duration, 
     secure: false 
    } 
    // rolling: false 
}); 

app.use(function(req, res, next) { 
    // if path does not start with /error/, then invoke session middleware 
    if (req.url.indexOf("/error/") !== 0) { 
     return sessionHandler(req, res, next); 
    } 
}); 
+0

Я использовал свой первый подход, работал как шарм! Я уже пробовал ваш последний подход, но поскольку я использую промежуточное программное обеспечение безопасности (https://github.com/krakenjs/lusca), мне пришлось вызвать «app.use (session ...» вместо того, чтобы держать его в переменной. Спасибо! – Bernardo

+0

@Bernardo - вы можете держать его в переменной. Я не уверен, почему вы думаете, что это не сработает. В 'app.use (session (...))' '' session() 'part выполняется только один раз при запуске приложения и возвращает новую функцию промежуточного программного обеспечения, используемую 'app.use()'. Именно это делает мой пример 'sessionHandler'. То же самое. – jfriend00

+0

да, я думаю, когда я попытался, я ошибся при присвоении переменной – Bernardo