2015-04-05 50 views
18

Express docs,它說:在Express中路由時,應用層和路由器級中間件有何區別?

應用級中間件必將Express實例,使用app.use()和app.VERB()。

路由器級中間件與應用級中間件一樣工作,除非它們綁定到express.Router()的實例。上例中在應用程序級別創建的中間件系統可以使用以下代碼在路由器級別進行復制。

在由快速生成提供的應用程序,我在主app.js看到,有:

var routes = require('./routes/index'); 
app.use('/', routes); 

而在./routes/index.js,我看到:

var express = require('express'); 
var router = express.Router(); 

/* GET home page. */ 
router.get('/', function(req, res, next) { 
    res.render('index', { title: 'Express' }); 
}); 

module.exports = router; 

什麼app.use的目的是將它傳遞給router.get而不是簡單地使用app.get?一般來說,在路由方面,app.VERBrouter.VERB之間有什麼區別?

回答

17

app.use傳遞給router.get而不是簡單地使用app.get的目的是什麼?

這都是爲模塊化設計的。它允許應用程序分成幾個較小的鬆散耦合的部分,並且因爲他們都沒有直接瞭解將它們組合在一起的共享的實例,所以可以實現模塊化。

例如,您可以構建一個完整的用戶帳戶子系統,用於處理註冊,登錄,忘記密碼等,並通過app.use(require("my-user-system"))將其「安裝」在幾個不同的應用程序之間。

這是背後的唯一目的。沒有功能,技術或性能差異。

一般來說,app.VERB和router.VERB在路由方面有什麼區別?

沒有區別。該應用程序有它自己的主/主路由器和app.VERB只是方便糖相當於app.router.VERB

+0

所以'express.Router()'和'應用=快遞()'將是相同的對象? – 2018-01-24 14:39:24

3

的例子將在這裏幫助:

在birds.js:

// birds.js 

var express = require('express'); 
var router = express.Router(); 

// middleware that is specific to this router 
router.use(function timeLog(req, res, next) { 
    console.log('Time: ', Date.now()); 
    next(); 
}); 
// define the home page route 
router.get('/', function (req, res) { 
    res.send('Birds home page'); 
}); 

在app.js:

// app.js 

var birds = require('./birds'); 
app.use('/birds', birds); 

現在要求到http://localhost:3000/birds/會去birds.js文件。

隨着應用程序的規模越來越大,這種模塊化方法將易於維護龐大的代碼庫。

來源:https://expressjs.com/en/guide/routing.html

相關問題