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如何实现,我不认为有可能实例化第二个路由器(并使其正常工作)。