在Express中是否有中间件声明的必需订单?

我发现如果app.js中的中间件顺序错误,他们将无法正常工作。

例如:

 app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'ejs'); // app.use(favicon()); app.use(logger('dev')); app.use(bodyParser.json()); app.use(bodyParser.urlencoded()); // app.use(express.static(path.join(__dirname, 'public'))); app.use('/', routes); app.use('/users', users); //the codes below don't work //set Cookie app.use(cookieParser()); app.use(session({ secret:setting.cookieSecret, key: setting.db, cookie:{maxAge:1000*3600*24*30}, store: new MongoStore({db:setting.db}), saveUninitialized: true, resave: true }) ); //use 'connect-flash' app.use(flash()); 

如果代码app.use(flash())app.set('view engine', 'ejs');之后没有移动app.set('view engine', 'ejs'); ,页面将显示TypeError: Object #<IncomingMessage> has no method 'flash'

更重要的是,如果我只是移动app.use(flash())它会创build错误req.flash() requires sessions但如果将cookieParse()session()移到urlencoded() req.flash() requires sessions ,则错误消失。

编辑第一个代码示例不再会产生错误:

 app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'ejs'); //changed app.use(flash()); app.use(favicon()); app.use(logger('dev')); app.use(bodyParser.json()); app.use(bodyParser.urlencoded()); //changed app.use(cookieParser()); app.use(session({ secret:setting.cookieSecret, key: setting.db, cookie:{maxAge:1000*3600*24*30}, store: new MongoStore({db:setting.db}), saveUninitialized: true, resave: true }) ); app.use(express.static(path.join(__dirname, 'public'))); app.use('/', routes); app.use('/users', users); 

所以我想知道:是否有一个强制性的命令,app.js中的中间件和configuration必须遵循?

是。 您在Express中调用中间件或configuration的顺序非常重要。 从express api文档 :

使用app.use()“定义”哪个中间件的顺序非常重要,它们是按顺序调用的,这就定义了中间件的优先级。

这就是为什么当你移动不同的app.use你会得到不同的错误。

例如,如果您为flash()函数使用connect-flash ,则connect-flash需要首先加载cookieparsersession中间件。 有一个顺序依赖 – cookieparser ,然后session ,然后flash

订单对于路由也很重要。 有关详细信息和讨论,请参阅Express 4.x中的新增function以及此计算器的答案 。

因此,在使用express时,请检查文档以确保您符合中间件路由的订单相关性(适用时)。