更好的中间件链接在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.get
, server.post
等添加了第一个非中间件路由时,它会自动为您完成。这可以是在这里的快速源代码中可以看到 ,虽然这是一个常见的混淆和问题点(其中大部分来自server.user(server.router)
,而不是让路由器去默认的地方,几乎总是正确的地方,所以这里是forumla:
- 正确命令
server.use
调用来设置你的中间件 - 你的具体路线与
server.get('/home')
和其他HTTP方法function - 任何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 } }
但是,如果你问为什么你不能在定义它的同一个语句中使用server
variables作为函数参数,那么这就是JavaScript的工作方式,并且与express无关。 你不能这样做:
var foo = console.log(foo.bar);
因为在整个语句完成之前foo
是未定义的。
FWIW我的观点是,像这样的可链接的代码是可疑的。 debugging器和断点是不友好的,不支持作为一stream的语言function,而不是真正的保存任何字符相比,每行是不被缩进和app.use(app.router)
,但这样做。