1

这是我的 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最后一个不像其他的那样被锁住,这很烦人。

如何完整链接我的 Express 中间件定义?

4

1 回答 1

6

express use 实现this每次都返回,因此总是可链接的。可链接性问题来自您对 的不必要使用,当您通过、等server.use(server.router)添加第一个非中间件路由时,express 会自动为您完成。这可以在此处的 express 源代码中看到,尽管这是一个共同点混乱和问题(其中大部分来自于做而不是让路由器默认去它去的地方,这几乎总是它的正确位置。所以这里是论坛:server.getserver.postserver.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);

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

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),但就这样吧。

于 2013-01-19T14:49:34.727 回答