这是我的Express配置代码:
var server = express()
.use(express.cookieParser())
.use(express.session({secret: buffer.toString('hex')}))
.use(express.bodyParser())
.use(express.static('./../'));
server.use(server.router);
最后.use
与其他{{1}}没有链接,这很令人讨厌。
如何完全连接Express中间件定义?
答案 0 :(得分:6)
快递use implementation每次都会返回this
,因此始终是可链接的。可链接性问题来自您不必要地使用server.use(server.router)
,当您通过server.get
,server.post
等添加第一个非中间件路由时,会自动为您完成。这可以{ {3}},虽然这是一个常见的混淆和问题点(大多数都来自于server.user(server.router)
而不是让路由器默认运行到哪里,这几乎总是正确的地方对于它。所以这是论坛:
server.use
来设置中间件的电话server.get('/home')
和其他HTTP方法功能的特定路由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
变量作为函数参数,那就是JavaScript的工作方式,而且与express无关。你不能这样做:
var foo = console.log(foo.bar);
因为foo
未定义,直到整个语句完成。
FWIW我认为像这样的可链接代码是可疑的。它对调试器和断点不友好,不支持作为一流的语言功能,并且与每行未缩进和app.use(app.router)
相比,并没有真正保存任何字符,但也是如此。