快遞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:
- 正確下令
server.use
通話設置你的中間件
- 你的具體路線與
server.get('/home')
和另一個HTTP方法功能離子
- 任何錯誤處理,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我的觀點是,像這樣的可鏈式代碼是可疑的。它對調試器和斷點不友好,不支持作爲一流的語言功能,並且與每行不縮進的情況相比,它並不真正爲您節省任何字符,但這樣做並非如此。
是的,我在第一次修改並更新後不久就發現。 –
您正在混淆會話處理和路由,而這兩者在很大程度上無關。以下是自動使用路由器的代碼: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'調用之前被添加。 –
嗡嗡聲。我所有的應用程序。使用'在任何'app.get'或'app.post'之前。但是這隻能定義處理程序。它真的會影響訂購嗎?您的陳述「在會話中間件之後出現的任何中間件都可以訪問'req.session'。」在我的情況下是不正確的。 – Randomblue