在Express中更好的中间件链接

Ran*_*lue 1 javascript node.js express

这是我的Express配置代码:

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

server.use(server.router);
Run Code Online (Sandbox Code Playgroud)

令人讨厌的是,最后一个.use并没有像其他人那样被束缚.

如何完全连接Express中间件定义?

Pet*_*ons 6

快速使用实现this每次都返回,因此总是可链接的.该chainability问题来自于你的不必要的使用server.use(server.router),这是为您快递时,你的第一个非中间件途径是通过增加自动完成server.get,server.post等等.这可以在这里明确的源代码中可以看出,尽管这是一个公共点混淆和问题(大多数都来自server.user(server.router)于完全相反,而不是让路由器默认运行到哪里,这几乎总是正确的位置.所以这里是论坛:

  1. 正确订购server.use调用以设置中间件
  2. 您的特定路由server.get('/home')和其他HTTP方法功能
  3. 任何错误处理,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);
Run Code Online (Sandbox Code Playgroud)

运行它,你在控制台上看到这一点.

Before cookie: undefined
after cookie: undefined
after session: { cookie: 
   { path: '/',
     _expires: null,
     originalMaxAge: null,
     httpOnly: true } }
Run Code Online (Sandbox Code Playgroud)

但是,如果您问为什么不能将server变量用作定义它的同一语句中的函数参数,那就是JavaScript的工作方式,并且与express无关.你不能这样做:

var foo = console.log(foo.bar);
Run Code Online (Sandbox Code Playgroud)

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

FWIW我认为这样的可链接代码是可疑的.它对调试器和断点不友好,不支持作为一流语言功能,并且与每行未缩进相比,并没有真正保存任何字符app.use(app.router),但也是如此.