更好的中间件链接在Express中

这是我的快速configuration代码:

var server = express() .use(express.cookieParser()) .use(express.session({secret: buffer.toString('hex')})) .use(express.bodyParser()) .use(express.static('./../')); server.use(server.router); 

最后的.use不像其他的那样被束缚,这真是令人烦恼。

我怎样才能充分链接我的Express中间件定义?

快速使用实现每次都会返回,因此总是可链接的。 可链接性问题来自于您不必要地使用server.use(server.router) ,当您通过server.getserver.post等添加了第一个非中间件路由时,它会自动为您完成。这可以是在这里的快速源代码中可以看到 ,虽然这是一个常见的混淆和问题点(其中大部分来自server.user(server.router) ,而不是让路由器去默认的地方,几乎总是正确的地方,所以这里是forumla:

  1. 正确命令server.use调用来设置你的中间件
  2. 你的具体路线与server.get('/home')和其他HTTP方法function
  3. 任何error handling,404中间件等

Express会在1到2之前添加路由器,一切都会好的。

如果您忽略server.router行,您声明的注释中,您将无法访问req.session 。 对不起,但事实并非如此。 下面是一个完整的工作快件应用程序,它显示了一个中间件,紧接在会话中间件之前,其中的req.session未定义,另一个中间件在会话中间件之后立即存在。

  var express = require('express'); var server = express(); server.use(function (q,r,n) {console.log('Before cookie:', q.session);n();}); server.use(express.cookieParser()); server.use(function (q,r,n) {console.log('after cookie:', q.session);n();}); server.use(express.session({secret: 'SEKRET'})); server.use(function (q,r,n) {console.log('after session:', q.session);n();}); server.get('/', function (q,r,n) {r.send("you got slashed");}); server.listen(3000); 

运行它,你可以在控制台上看到它。

 Before cookie: undefined after cookie: undefined after session: { cookie: { path: '/', _expires: null, originalMaxAge: null, httpOnly: true } } 

但是,如果你问为什么你不能在定义它的同一个语句中使用servervariables作为函数参数,那么这就是JavaScript的工作方式,并且与express无关。 你不能这样做:

 var foo = console.log(foo.bar); 

因为在整个语句完成之前foo是未定义的。

FWIW我的观点是,像这样的可链接的代码是可疑的。 debugging器和断点是不友好的,不支持作为一stream的语言function,而不是真正的保存任何字符相比,每行是不被缩进和app.use(app.router) ,但这样做。