2013-01-19 27 views
1

鏈接這是我的快遞配置代碼:更好的中間件在快速

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中間件定義的完整鏈接?

回答

6

快遞use implementation每次都會返回this,因此始終是可鏈接的。可鏈接性問題來自您不必要地使用server.use(server.router),當您通過server.get,server.post等添加第一個非中間件路由時,它會自動爲您完成。這可以是can be seen in the express source code here,儘管這是一個常見的混淆和問題點( 。其中大部分來自做server.user(server.router),而不是僅僅讓,哪裏就有奇蹟在默認情況下,這幾乎總是它的正確位置路由器走在所有所以這裏的forumla:

  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的是如何工作的,並具有零做快遞。你可以這樣做:

var foo = console.log(foo.bar); 

因爲foo是不確定的,直到整個語句完成。

FWIW我的觀點是,像這樣的可鏈式代碼是可疑的。它對調試器和斷點不友好,不支持作爲一流的語言功能,並且與每行不縮進的情況相比,它並不真正爲您節省任何字符,但這樣做並非如此。

+0

是的,我在第一次修改並更新後不久就發現。 –

+1

您正在混淆會話處理和路由,而這兩者在很大程度上無關。以下是自動使用路由器的代碼:https://github.com/visionmedia/express/blob/master/lib/application.js#L407。任何在會話中間件後出現的中間件都可以訪問'req.session'。只要確保所有的vanilla'app.use'調用來自任何'app.get'或'app.post'等方法之前,你就會好起來的。我認爲這已經改變。它曾經是路由器的最後一個,現在路由器就在你的第一個'app.get/post/put/etc'調用之前被添加。 –

+0

嗡嗡聲。我所有的應用程序。使用'在任何'app.get'或'app.post'之前。但是這隻能定義處理程序。它真的會影響訂購嗎?您的陳述「在會話中間件之後出現的任何中間件都可以訪問'req.session'。」在我的情況下是不正確的。 – Randomblue