簡而言之,後面括號中的 (app) 是講實例化後的 app 傳入到前面路由文件中。
首先,require('./routes') 即 require('./routes/index.js'),然後看 index.js 內部, 導出的一定是一個方法,類似:
model.exports = app => {
app.use('/aaa',require('./aaa.js'));
app.use('/bbb',require('./bbb.js'));
app.use('/bbb',require('./bbb.js'));
}
注意: 上面的app是一個形參, 在入口文件(app.js或index.js)中傳入的app才是一個實參。
在 app.js 中的 require('./routes') 相當於引入這個方法,require('./routes')(app) 括號裏的 app 就是傳入的實參。這個 app 是 express() 方法創建的web服務器。於是就相當於 app.js 這個工程的入口文件中引入了 ./routes/index.js 中的所有的路由。
擴展
入口文件中往往也會使用 app.use('/', routes),這裏的 routes 是引入的定義路由的文件 ./routes/index.js,這種寫法是將 routes 路由對象中的路由全部匹配到 '/' 路由後面。
例如:
當一個路由有好多個子路由時用 app.use(path, router)
http://localhost:5000/main/a
http://localhost:5000/main/b
http://localhost:5000/main/c
路由/main後面有三個子路由緊緊跟隨,分別是 /a,/b,/c。
如果使用 app.get(),則要像下面這樣不斷的重複,很麻煩,也不利用區分:
app.get("/main", callback);
app.get("/main/a", callback);
app.get("/main/b", callback);
app.get("/main/c", callback);
我們可以創建一個 ./routes/index.js 專門用來一個路由匹配多個子路由:
// ./routes/index.js 文件
var express = require('express');
var router = express.Router();
router.get('/', (req, res) => {
res.send('/');
res.end();
})
router.get('/a', (req, res) => {
res.send('a');
res.end();
})
router.get('/b', (req, res) => {
res.send('b');
res.end();
})
router.get('/c', (req, res) => {
res.send('c');
res.end();
})
module.exports = router;
在 app.js 中導入 ./routes/index.js:
var express = require('express');
var router = require("./routes");
var app = express();
app.use('/main', router); // router路由對象中的路由都會匹配到 '/main' 路由後面
app.get('/test', function (req, res) {
res.send('Hello, World!');
res.end();
})
app.listen(5000, function () {
console.log('app is running at port 5000.');
})
app.use 和 app.get 的選用
路由規則是 app.use(path,router) 定義的,router 代表一個由 express.Router() 創建的對象,在路由對象中可定義多個路由規則。可是如果我們的路由只有一條規則時,可直接接一個回調作為簡寫,也可直接使用 app.get 或 app.post 方法。當一個路徑有多個匹配規則時,使用 app.use()
注意:
router.use()為特定路由器服務的路由安裝中間件;
app.use()為應用程序的所有路由安裝中間件;
app.use(path, callback)中的callback既可以是router對象又可以是函數;
app.get(path, callback)中的callback只能是函數。