2016-08-17 16 views
2

我想知道如果我在expressjs中編寫該文件會發生什麼(我們假設應用程序是expressjs應用程序)。如果您使用express js重載相同的路由,會發生什麼情況?

app.get.use('/here' , function(req, res) { 
     // EXECUTE SET OF ACTION NUMBER 1 
}); 

app.get.use('/here' , function(req, res) { 
     // EXECUTE SET OF ACTION NUMBER 2 
}) 

我們編寫了兩次相同的路線,但採用了不同的一組操作。第二個聲明是否會超載第一個聲明?

+3

爲什麼不試試呢? –

+0

當然,但我也想要更多的理論信息,我在文檔中清楚地發現了一些困難,可能我錯過了某些idk。但如果你有一些信息,請提前致謝:) –

回答

6

這取決於回調函數內發生了什麼。考慮三個不同的例子:

一個)

const express = require('express'); 
const app = express(); 

app.get('/', (req, res, next) => { 
    console.log('1!'); 
    res.json(true); 
}); 

app.get('/', (req, res) => { 
    console.log('2!'); 
    res.json(true); 
}); 

app.listen(3000); 

B)

const express = require('express'); 
const app = express(); 

app.get('/', (req, res, next) => { 
    console.log('1!'); 
}); 

app.get('/', (req, res) => { 
    console.log('2!'); 
    res.json(true); 
}); 

app.listen(3000); 

C)

const express = require('express'); 
const app = express(); 

app.get('/', (req, res, next) => { 
    console.log('1!'); 
    next(); 
}); 

app.get('/', (req, res) => { 
    console.log('2!'); 
    res.json(true); 
}); 

app.listen(3000); 

在(a)中的情況下,工作流是頂TO-底部。第一個路由處理程序啓動,console.logs「1!」並回應true。由於完整的響應已發送,所以永遠不會到達以下路由處理程序。

在(b)的情況下,執行暫停在第一個路由處理器。它既不響應也不允許執行進一步。如果你curl這個應用程序,你會最終請求超時,但你會看到「1!」在控制檯上。

最後,在(c)的情況下,您可以看到next函數調用。這使得Express進行執行並轉到下一個路由處理程序(如果有的話)。由於還有另一個路由處理程序,所以它會被執行,所以你最終得到「1!」和「2!」打印在控制檯上,以及正確發送的響應。

的幾點這裏:

  • 隨時撥打next如果你希望另一路由處理當前後運行,而當你寫一箇中間件,或者在你的情況下,尤其重要的是, 「中間件」應用程序,你可能會添加到另一個應用程序,
  • 可以在多個處理程序中建立響應,例如,當第一個聲明標頭和/或正文時,以及下一個添加一些標題和/或身體(這是奇怪的,我強烈勸阻你這樣做),並
  • 一旦發送了響應,執行停止,並且不能到達其他路由處理程序(例如,當您使用條件塊時不能保證)。
相關問題