什么是路由

广义上讲,路由就是映射关系

Node.js(笔记13) - Express - 路由和路由模块化_Express

10086都打过,按哪个键响应不同的业务,在这里,路由是按键与服务之间的映射关系。


Express中的路由

在Express中,路由指是客户端的请求与服务器处理函数之间的映射关系。

Express中的路由分3部分组成,分别是请求的类型、请求的URL地址、处理函数,语法是:

app.METHOD(PATH,HANDLER)

METHOD:请求的类型,也叫请求方法,如:GET、POST、OPTIONS等;

PATH:请求的URL地址,是后端根据业务逻辑指定的路径;

HANDLER:处理函数;

看个示例:

app.get('/',function(req,res){
res.send('Hello world!')
})

app.post('/',function(req,res){
res.send("Got a POST request")
})

第一个路由是匹配客户端的 GET 请求,请求地址是 '​/​',FN是处理函数,其中 res.send() 响应请求;

第二个路由是匹配 POST请求,请求地址也是 '​/​',FN是处理函数。


路由的匹配过程

每当一个请求到达服务器后,需要先经路由的匹配,只有匹配成功后,才会调用对应的处理函数。

在匹配时,会按照路由的顺序进行匹配,如果请求类型和请求URL同时匹配成功,则Express会将这次请求,转交给对应的FN函数进行处理。

Node.js(笔记13) - Express - 路由和路由模块化_Express_02

 路由匹配注意点:

1)按照定义的先后顺序进行匹配。

2)请求类型和请求的URL同时匹配成功,才会调用对应的处理函数。


路由的使用

简单用法

在Express中使用路由最简单的方式,就是把路由挂载到 app 实例上,如:

const express = require('express')
const app = express()
app.get('/',(req,res)=>{console.log('Hello world!');})
app.post('/',(req,res)=>{console.log('Got a post request.');})
app.listen(8000,()=>{
console.log('Server is running at http://127.0.0.1:8000.');
})

这个代码上一篇已经见过了,需要理解的是 路由挂载

这种方法的用法不多,因为这里的路由可能会越写越多,不便维护,需要模块化路由。


模块化路由

为了方便对路由进行模块化管理,Express 不建议将路由直接挂载在 app 实例上,而是推荐将路由抽离为单独的模块。

5个步骤如下:

1)创建路由模块对应的 js 文件;

2)调用 express.Router() 方法创建路由对象;

3)向路由对象上挂载具体的路由;

4)使用 module.exports 向外共享路由对象;

5)使用 app.use() 函数注册路由模块;

创建路由模块

新建路由模块文件  router.js

const express = require('express')
// 创建路由对象
const router = express.Router()
// 挂载路由
router.get('/user/list',(req,res)=>{
res.send('Get user list');
})
router.post('/user/add',(req,res)=>{
res.send('Add new list');
})
// 暴露模块
module.exports = router

注册路由模块

新建服务器文件 server.js 

const express = require('express')
const app = express()

// 引入路由模块
const router = require('./router.js')
// 注册路由模块
app.use(router)

app.listen(8000,()=>{
console.log('Server is running at http://127.0.0.1:8000.');
})

看下apifox 里的测试结果;

先是GET请求:

Node.js(笔记13) - Express - 路由和路由模块化_Express_03

注意红黄框的显示;

再看下POST请求:

Node.js(笔记13) - Express - 路由和路由模块化_Express_04


注意:app.use() 这个方法,是用来注册全局中间件的;

共享静态资源:

app.use(express.static('./clock'))
app.use('/clock',express.static('./clock'))

注册路由模块:

app.use(router)
app.user('/api',router) // 为路由添加统一前缀


为路由模块添加前缀

类似于托管静态资源时,为静态资源统一挂载访问前缀一样,路由模块添加前缀的方式也类型;

app.user('/api',router)

那之前的请求路径是: 

Node.js(笔记13) - Express - 路由和路由模块化_Express_05

现在的请求路径变为:

Node.js(笔记13) - Express - 路由和路由模块化_Express_06

POST请求的写法也是一样的,路由的前缀是统一一起加上去的。