为什么app.use(…)不能在asynchronous函数中声明?

我正在尝试使用express框架来设置node.js服务器并实现会话。

这工作:

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(会话(…))在一个asynchronous函数,它被忽略 – 会话处理不再工作。

这里 :

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

为什么不能做到这一点?

中间件必须在特定的路由处理程序之前安装。 如果您查看app.use()app.get()的Express代码,则它们都将处理程序添加到内部路由器堆栈中,并且这些处理程序按照添加的顺序进行search,而不pipe它们是中间件处理程序还是端点处理程序。 因此,如果在中间件处理程序之前先放置端点处理程序,那么中间件可能不会被调用,并且肯定不会在端点之前被调用(因此可能会破坏它的用途)。

如果要asynchronous安装中间件,则需要在安装asynchronous中间件之后安装所有的路由处理程序。