简而言之,后面括号中的 (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 只能是函数。


Wonfody
58 声望4 粉丝

像春风里一出梦, 像梦路的一声钟!