express.js中的第二个路由器或中间件path

我有我的应用程序通常的中间件堆栈:

app.configure(function() { app.use(express.static(PUBLIC_DIR)); app.use(express.favicon()); app.use(express.bodyParser({ keepExtensions: true, uploadDir: '/tmp/neighr' })); app.use(express.methodOverride()); app.use(express.cookieParser()); app.use(express.session({ secret: '***REDACTED***', store: sessionStore, })); app.use(express.csrf()); app.use((require('connect-flash'))()); app.use(passport.initialize()); app.use(passport.session()); app.use(function(req, res, next) { app.locals({ _csrf: req.session._csrf, url: req.url, user: req.user, authenticated: req.isAuthenticated(), messages: { info: req.flash('info'), error: req.flash('error'), success: req.flash('success') } }); next(); }); app.use(app.router); app.use(express.logger()); app.use(express.errorHandler()); }); 

正如你所看到的, express.static是堆栈中的第一个,所以静态资源将被提供,而不会通过整个会话的东西,只会使加载时间更长。

但是,我确实有一些dynamic数据,我想在没有所有会话的情况下提供服务:

 app.get('/avatar/:id', function(req, res) { var fid = res.params.id; /* load binary from database */ res.send(data); }); 

这条路线在堆栈结尾的app.router内。 我想继续申报这个和其他的路线,但我怎么能得到expressionparsing这些会话中间件?

未来可能会有更多这样的dynamic路线,参数更多。

一旦你声明了一个路由,Express在那时将router中间件插入到中间件堆栈中,所以如果你要在加载会话中间件之前声明一个路由, 所有的路由请求都会跳过会话中间件:

 app.get('/one', ...); // inserts `app.router` into the stack at this point app.use(express.session(...)); app.get('/two', ...); // will skip the session middleware 

我可以想到两个解决scheme:创build自己的中间件来处理不应该通过会话中间件传递的请求,或者为每个要通过它运行的路由显式设置会话中间件。

第一个scheme

 app.use(function(req, res, next) { if (req.path.indexOf('/avatar/') === 0) { // parse out the `id` and return a response } next(); }); 

这显然不是很灵活。

解决scheme二

 // instantiate the session middleware: var sessionMiddleware = express.session(...); // default setup: insert the router before the session middleware: app.use(app.router); app.use(sessionMiddleware); // Pass it explicitly to the route: app.get('/two', sessionMiddleware, function(req, res) { ... }); 

在你的情况下,你也可以使用Passport,你可能需要一些中间件:

 var authMiddleware = [ express.session(...), passport.initialize(), passport.session() ]; app.get('/two', authMiddleware, ...); 

看看Express如何实现,我不认为有可能实例化第二个路由器(并使其正常工作)。