theme: condensed-night-purple
highlight: atelier-cave-dark
开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第35天,点击查看活动详情
大家在学习Koa框架的时候都不可避免的会接触的路由这个东西,那对于我们初学者来说路由到底是什么呢?
今天我们来好好讲解一下什么是路由
首先我们来看一下路由是什么?
路由,它决定了不同的URL是如何被不同的执行的。
这句话什么意思?比如你请求了某个网站的用户列表的URL他就会去执行查询用户列表,并返回用户列表数据。如果你请求了特定用户的接口的URL,他就会查询特定用户,并返回给你特定用户的数据。
路由的本质是什么?
在Koa中,路由的本质就是一个中间件。
那我们为什么要用路由。
想回答这个问题,我们要从两个方面来考虑,
- 第一个是如果没有路由会怎么样。
- 第二个是路由存在的意义是什么。
如果没有路由会怎么样
我们先来看一下如果没有路由会发生什么。
首先,所有的请求都会做相同的事情。比如我请求了 get 新浪微博的用户列表接口,跟我请求的 get 新浪微博的特定的用户接口都会做相同的查询。这显然是不行的,我们期望它能够做的是不同的查询。如果没有路由,所有的请求也都会返回相同的值。
我们来设想一下,如果你请求淘宝,并且再请求一次百度,这两次请求都会给你返回相同的页面。这样是不是就比较乱套了。
下面我们来写一个程序,演示一下什么是路由。
- 首先在本地先创建一个文件夹。
- 在这个文件夹里面,我们启动
CMD
,打开命令行工具。 - 在命令行工具里面先执行
npm init -y
初始化项目。 package.JSON
文件初始化好之后,我们再执行cnpm i koa--save
。- Koa 模块安装成功后。我们用
Visual Studio Code
打开当前的文件。在当前文件下面,我们创建一个文件叫app.js
。在app.js
里面开始编写Koa2
的代码。
cost koa = require('koa')
然后我们再使用实例化koa
的方式得到一个服务器应用对象。
const app = new koa()
当我们通过实例化操作得到一个koa
对象,拿到一个 APP 对象,通过 APP.use
我们就可以开启一个中间件了。这里面我们使用ctx当作形参写一个箭头函数,我们需要向客户端响应一句话就可以了。比如ctx.body='hello world'
。然后再开启一个监听端口,比如我们要监听的是 3000 端口。这个代码写好之后,我们就完成了一个简单的服务器的应用。
cost koa = require('koa')
const app = new koa()
app。use(ctx =>{
ctx.body = 'hellp world'
})
app.listen(300)
然后我们使用 node 命令来开启服务,切换到控制台。在控制台我们使用 node app.js
开启客服务,此时没有报错,光标一直在闪,证明这个服务已经开启了。
不管你是访问什么样的一个请求,它都会给你返回同一个内容。我们现在用的是get
请求。我们按 F12 打开控制台,在浏览器的开发者工具,我们点network
刷新。可以看见。这里面它发了两个请求,一个是要请求一个图标。我们看一下上面请求。此时用的是get
请求。
可以看到我们现在没有使用路由来进行管理,此时不管你是请求什么样的路径,它都是乱套的。所以我们在整个项目开发过程中,路由是非常重要的。
路由的存在意义
通过刚刚的代码,我们可以看到路由它的存在意义。
- 首先是处理不同的
URL
,我们要做什么事情,根据路由来决定。我们通过路由就找到了这个地方,去做相应的业务逻辑的处理好,这是它的第一个意义。 - 第二点就是处理不同的
HTTP
方法,因为我们在请求一个地方的时候,可能你这个请求方式会有很多种,比如get
请求、post
请求。每一种请求的方法,它的所代表的意义又不一样。所以我们为了区分不同的请求方法,我们也得去使用路由。 - 最后一点就是为了解析
URL
上面的参数,因为我们在去做前后端分离开发,或者是服务端渲染。不管怎么样,只要是属于web
应用,我们都需要通过http请求,并且请求一个地址,把我们要请求的参数传给服务器端,服务器端根据我们传的参数来决定我们要做什么事情,或者是服务器要给我们去怎么查询数据库返回什么样的结果。所以这一点也是比较重要的。
以上三点就说明了路由存在的意义,所以我们在项目开发的过程中,一定要去区分好路由,以及对路由要有一个合理的规划。
写在最后
伙伴们,如果你觉得我写的文章对你有帮助就给zayyo点一个赞👍或者关注➕都是对我最大的支持。当然你也可以加我微信:IsZhangjianhao,邀你进我的前端学习交流群,一起学习前端,成为更优秀的工程师~