express — app 和 router
https://www.runoob.com/w3cnote/express-4-x-api.html
常用的两类对象
- app对象:
var express = require('express') var app = express()
- router对象:
var express = require('express') var router = express.Router()
注意:一个应用程序中只能有一个app,而 router对象可以创建多个。
app对象的API
express()用来创建一个Express的程序。每个Express程序(即app)有一个内建的app路由。所以app也可以实现路由
- app.use([path,], function [, function...]):https://www.runoob.com/w3cnote/express-4-x-api.html
- 挂载中间件方法到路径上。如果路径未指定,那么默认为"/"。路由自身也是一个中间件,所以路由也可以作为中间件 放在 app.use 里面。
- 中间件方法是顺序处理的,所以中间件包含的顺序是很重要的。
- 路径可以是代表路径的一串字符,一个路径模式,一个匹配路径的正则表达式,或者他们的一组集合(即可以是一个数组)。数组类path,如下:
app.use(['/abcd', '/xyza', /\/lmn|\/pqr/], function (req, res, next) { next(); })
- 中间件方法可以是一个中间件方法,一系列中间件方法,一组中间件方法或者他们的集合(即,可以是一个数组)。
在逻辑上使用一个数组 来 组织一组中间件,以数组作为 app.use 中间件参数:var r1 = express.Router(); r1.get('/', function (req, res, next) { next(); }) var r2 = express.Router(); r2.get('/', function (req, res, next) { next(); }) app.use('/', [r1, r2]);
- app.get:可以理解为特殊的app.use
- app.post:可以理解为特殊的app.use
router对象的API
一个router对象是一个单独的实例关于中间件和路由。你可以认为其是一个"mini-application"(迷你程序),其具有操作中间件和路由方法的能力。每个Express程序(即app)有一个内建的app路由。路由自身表现为一个中间件,所以你可以使用它作为app.use()方法的一个参数或者作为另一个路由的use()的参数。 顶层的express对象有一个Router()方法,你可以使用Router()来创建一个新的router对象。
- router.use([path], [function, ...] function):
给可选的path参数指定的路径挂载给定的中间件方法,未指定path参数,默认值为/。 这个方法类似于app.use()。 - router.get:可以理解为特殊的router.use
- app.post:可以理解为特殊的router.use
app.use 和 router.use 有什么区别
- app.use:应用程序级别中间件
- router.user:路由器级别中间件
- app.use 和 router.use区别: 为什么有app.use了,还要router.use?
因为 app.use 中的路径都是从从头开始,一个完整的路径。而且app.use都写在一个模块里,查看比较麻烦,也不好维护。
如下所示,app.use 创建的路由:app.get('/todos', (req, res) => { res.send('df') }) app.get('/todos/:id', (req, res) => { res.send('df') }) app.post('/todos', (req, res) => { res.send('df') }) app.post('/todos/:id', (req, res) => { res.send('df') }) app.delete('/todos/:id', (req, res) => { res.send('df') })
上面的 path 都是在 todos下,用 app.use 无法做到 类似子路由的结构。而router.use可以实现,因为router自身就是一个中间件,可以作为自己的router.use的中间件。如下改造:
// main.js const router = require("./routes/index") app.use('/todos', router) // router作为 app.use 的中间件,router里面的路由 会自动添加上这里的 path /todos
// router/index.js const router = express.Router() router.get('/', (req, res) => { res.send('df') }) router.get('/:id', (req, res) => { res.send('df') }) router.post('/', (req, res) => { res.send('df') }) router.post('/:id', (req, res) => { res.send('df') }) router.delete('/:id', (req, res) => { res.send('df') })