动态

详情 返回 返回

require('./routes')(app) 後面加個(app)釋義 - 动态 详情

簡而言之,後面括號中的 (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.jsindex.js)中傳入的 app 才是一個實參。

app.js 中的 require('./routes') 相當於引入這個方法,require('./routes')(app) 括號裏的 app 就是傳入的實參。這個 appexpress() 方法創建的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.useapp.get 的選用

路由規則是 app.use(path,router) 定義的,router 代表一個由 express.Router() 創建的對象,在路由對象中可定義多個路由規則。可是如果我們的路由只有一條規則時,可直接接一個回調作為簡寫,也可直接使用 app.getapp.post 方法。當一個路徑有多個匹配規則時,使用 app.use()

注意:
router.use() 為特定路由器服務的路由安裝中間件;
app.use() 為應用程序的所有路由安裝中間件;

app.use(path, callback) 中的 callback 既可以是 router 對象又可以是函數;
app.get(path, callback) 中的 callback 只能是函數。

Add a new 评论

Some HTML is okay.