在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
需要首先加载cookieparser
和session
中间件。 有一个顺序依赖 – cookieparser
,然后session
,然后flash
。
订单对于路由也很重要。 有关详细信息和讨论,请参阅Express 4.x中的新增function以及此计算器的答案 。
因此,在使用express时,请检查文档以确保您符合中间件和路由的订单相关性(适用时)。