在Express中更好的中间件链接

时间:2013-01-19 12:32:53

标签: 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);

最后.use与其他{{1}}没有链接,这很令人讨厌。

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

1 个答案:

答案 0 :(得分:6)

快递use implementation每次都会返回this,因此始终是可链接的。可链接性问题来自您不必要地使用server.use(server.router),当您通过server.getserver.post等添加第一个非中间件路由时,会自动为您完成。这可以{ {3}},虽然这是一个常见的混淆和问题点(大多数都来自于server.user(server.router)而不是让路由器默认运行到哪里,这几乎总是正确的地方对于它。所以这是论坛:

  1. 正确订购server.use来设置中间件的电话
  2. 具有server.get('/home')和其他HTTP方法功能的特定路由
  3. 任何错误处理,404中间件等
  4. 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)相比,并没有真正保存任何字符,但也是如此。