简而言之,后面括号中的 (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
只能是函数。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。