2016-02-10 2 views
2

Я пытаюсь настроить node.js-сервер, используя экспресс-структуру и реализовать сеансы.Почему app.use (...) не может быть объявлен в async-функции?

Это работает:

var express = require('express'); 
var session = require('express-session'); 
var redis = require('redis'); 

var server = express(); 
var redisClient = redis.createClient(); 

server.use(session({secret: 'mySuperSecretKey'})); 

server.listen(8000, function() { 
    console.log('listening...'); 
}); 

server.get('/', function (req, res) { 
    req.session.aSessionEntry = 'value'; 
    res.send('Your session entry is' + req.session.aSessionEntry); 
}); 

Однако, когда я объявляю server.use (сеанс (...)) внутри функции асинхронной, она игнорируется - обработка сеанса больше не работает.

Здесь:

var express = require('express'); 
var session = require('express-session'); 
var redis = require('redis'); 

var server = express(); 
var redisClient = redis.createClient(); 

redisClient.get("sessionSecret", function(err, reply) { 
    server.use(session({secret: reply.toString()})); 
}; 

server.listen(8000, function() { 
    console.log('listening...'); 
}); 

server.get('/', function (req, res) { 
    req.session.aSessionEntry = 'value'; 
    res.send('Your session entry is' + req.session.aSessionEntry); 
}); 

Почему не удается это сделать?

+0

Я не знаю точно, но я думаю, что если вы положили 'server.listen' внутри обратного вызова функции async, он должен работать –

+1

. Скорее всего, потому, что' use' - это функция настройки для добавления промежуточного программного обеспечения. Когда вы вызываете 'listen', express использует то, что было настроено. Но, помещая его в обратный вызов асинхронной операции, сначала вызывается 'listen', без настройки сеанса. – Joseph

+0

См. Http://expressjs.com/ru/4x/api.html#app.use. Порядок определения важен, может возникнуть проблема с регистрацией '.get'. –

ответ

1

Среднее программное обеспечение должно быть установлено перед конкретными обработчиками маршрута. Если вы посмотрите в экспресс-код для app.use() и app.get(), они оба добавляют обработчики во внутренний стек маршрутизатора, и эти обработчики выполняют поиск в том порядке, в котором они были добавлены, независимо от того, являются ли они промежуточными обработчиками или обработчиками конечных точек. Итак, если вы помещаете обработчики конечных точек в первую очередь перед обработчиками промежуточного программного обеспечения, тогда промежуточное программное обеспечение может не вызываться и, конечно же, не будет вызвано до конечной точки (таким образом, вероятно, он победит его цель).

Если вы хотите установить асинхронное промежуточное программное обеспечение, вам необходимо установить все обработчики маршрутов ПОСЛЕ того, как будет установлено асинхронное промежуточное программное обеспечение.

+0

Я пробовал, и он работает. И теперь я понимаю, как работают обработчики маршрутов и промежуточное ПО. Спасибо ! –

Смежные вопросы