木灵鱼儿
阅读:1557
koa教程2 路由
koa的路由使用,有一个官方的路由插件koa-router
,安装这个插件并如下方式使用:
const Koa = require("koa");
const Router = require("koa-router");
const app = new Koa();
const router = new Router();
router.get("/", (ctx, next) => {
console.log("进入到路由");
})
app.use(router.routes());
app.listen(8080);
引入路由,并new出路由对象,然后路由对象使用对应的前端请求协议方式来监听路由地址,然后有一个回调方法,最后再将这个router对象通过use注册,router使用routes方法将路由全部注册。
router的协议
- get 请求 (获取数据)
- post 请求 (新增数据,也常用来获取,历史原因,当时没那么多协议扩充)
- put 请求(用于更新资源,多次请求只改变一个资源这种)
- del 请求(用于删除资源)
- patch 请求(是对PUT方法的补充,用来对已知资源进行局部更新,补丁更新)
- all 请求 (可用于所有方法匹配)
除了常见的get和post请求,还有一些请求协议,使用方式都是:router.xxx()
多路由处理
主题或模块划分
当一个项目稍微复杂以后,单一的路由结构或者说所有路由都写在一个js文件里面,是很不合理的,所以常用的方式,都是将路由进行划分,相同的部分拆分为一块,也就是主题或模型划分。
比如,访客路由和用户路由,已登录和未登录。甚至还可以更细化,根据不同的功能,主题,逻辑进行划分,具体就要看项目的需要了,这个是一个不断成长的过程,没有谁的路由一开始就是非常完美的,这是一种经验的累积,但是总体来说,他要有一定的范围区域,这样有利于代码的维护和阅读。
api版本
对于一个项目来说,版本是不可避免的一个问题,当一个api进行更新升级时,也许旧版本的api返回的内容与新的不符合,但是用户那边可能还是使用的老版本,所以后端处理不得不进行兼容处理,兼容用户使用的旧版本,开发新的api版本。
常见的做法就是在api上携带版本路径,做法有三种:
- api路径:
api/v1/xxx/xx
- 查询参数:
api/xxx/xx?version=1
- header:在头信息里面携带版本号
一般来说,兼容三个版本已经是足够了,因为兼容的越多,代码量也越多,维护成本也越大。
那么后端如何进行多个版本之间的兼容,上面的方法只是前端请求时告诉后端我请求的api版本,后端的话,建议是不同的api版本采用不同的路由监听,尽量不要写在一个路由里面,一是代码一多,维护阅读不便,二是写代码有一个原则:修改代码尽量少或者不做,对代码的扩展可以开放;这样做有有一个好处,就是在不影响旧代码的情况下,新的功能依旧可以使用实现。不会影响原来的功能。
拆分
我们将相同主题的路径拆分为一个js文件,自己引入router对象,然后再导出,最后再app.js文件中引入,统一激活。
路由文件1:
const Router = require("koa-router");
const router = new Router();
router.get("/test1", (ctx, next) => {
ctx.body = "test1";
});
module.exports = router.routes();
路由文件2:
const Router = require("koa-router");
const router = new Router();
router.get("/test2", (ctx, next) => {
ctx.body = "test2";
});
module.exports = router.routes();
主文件激活:
const Koa = require("koa");
const app = new Koa();
app.use(require("./router/test1")).use(require("./router/test2"));
app.listen(8080);
省点事就不用再const xxx = require()了,反正直接导出的就是routes。
版权申明
本文系作者 @木灵鱼儿 原创发布在木灵鱼儿 - 有梦就能远航站点。未经许可,禁止转载。
相关推荐
centos 安装最新版 node.js
[hide]先用yum 安装一次node先升级yum update 提示下载程序,回复y安装nodeyum install nodejsyum安装的node一般都不是最新的,所以我们还需要升级node的版本npm i n -g全局安装一个n插件n lts表示安装最新的稳定版!一些常用命令n ls查看已安装的node版本n rm 16.0.3删除16.0.3版本更多功能阅读插件文档:n等待安装完毕后,此时其实版本已经安装好了,但是输入node -v还是低版本,是因为centos的用户缓存问题。我们退出登录再登录就会刷新缓存了,此时的node -v输出的就是最新版本exit 退...
vue router 一个重定向页面的思路
当项目需要和其他项目进行沟通的时候,往往常见的做法就是,我在a网站点击一个按钮,在链接中携带query参数啥的,然后去访问b网站页面。此时可能会有两种情况:跳转的链接就是b网站的具体链接地址。跳转的链接是b网站的一个跳板,跳板会对参数做一些操作,然后进行重定向。两种做法都各有优势:第一种省事简单,但是如果以后b网站链接层级发生变化,那么就会导致链接不可能,到时候还需要进行修改,很痛苦。第二种的话,我们需要写一个跳板页面,但是通过一些参数要求,甚至自身加上一些逻辑处理,那么他的功能性会更强一些。那么,在vue中,做一个重定向页面,怎么做?思路思路1利用路由守卫,当链接上存在某个参数的时候,...
node npm yarn 如何同时运行多个指令
node的bash命令其实是有对应的指令字符的,但是,这个指令只能再linux,mac上才有生效,再windows是无效的,所以了解一下就行。命令说明&&顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令&并行执行多条命令||顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令|管道符windows上进行多命令"scripts": { "dev": "cross-env NODE_ENV=development webpack --env development --progress -...
关于使用this.$router对象进行跳转时产生重定向错误的解决方法
vue-router升级版本后,使用$router进行跳转时,将返回一个promise对象,这其实是好事,但是除了这个,官方对报错也做了调整。这里先看一下常见一个重定向错误:为什么产生这个错误,我在谷歌查了下,有这么一个解释:这是设计使然。为什么?阅读此评论。TL;DR:假设您在页面 A,然后单击一个按钮将您带到页面 B(有点像method: goToB() { router.push('/B'); }页面 A)。但是页面 B有一个导航守卫,将您发送到页面 C。此错误是让该goToB()功能知道路由器无法完成所需任务并且用户尚未登陆的一种方式/B。这很讨厌,但信息量很大这里最大的困惑是重...

koa教程2 HttpBearerAuth 传递token
前端发送token到后端,一般有三种方式:链接中携带token,query参数post这种请求body中携带token头信息携带token但是事实上http已经为我们提供了传token的方式,是一个相对来说比较安全的方式,就是HttpBearerAuth 其实他也是一个头信息来着,只是相对来说多了一点操作,在apipost软件中,我们可以直接可视化设置如果是axios,则是需要添加一个头信息:axios({ method: 'get', url: url, responseType: 'blob', headers: { 'Authoriz...

koa教程2 微信openid登录
微信的openid,前端登录时,会发送一个code码到后端,后端接收到这个code,然后配合appid、appsecret参数,像wx发送一个get请求。wx的请求地址:GET https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code具体查看文档:微信官方文档-服务端可以看到这段get请求有四个参数:属性类型默认值必填说明appidstring 是小程序 appIdsecretstring 是...
koa教程2 权限分级控制
在之前的代码中,我们使用了一个scope属性来表示用户的权限,但是scope是一个数字,他的阅读性是非常差的,当其他人开发的时候,可能并不知道你这个数字是什么意思?所以,我们需要将它转义成文本。为了方便判断,我们在enum.js中增加一个用户等级的对象enum.js://通用判断是否存在该类型 function isThisType(val) { let flag = false; Object.keys(this).find(key => { if (this[key] === val) { return flag = true; } })...
koa教程2 token鉴权
之前我们在token中传入我们的自定义参数,现在我们要做一个token鉴权,很简单,如果他的token合法,就可以访问这个路由,如果不合法,就打回。这个也不能说是真正意义上的鉴权,因为他还没有判断scope值,所以只能说是简单判断。做这个判断我们就可以通过中间件的形式,于是我们在middlewares目录下创建一个auth.js文件auth.js:const parseBearerToken = require("@utils/paresBearerToken"); const jwt = require("jsonwebtoken"); cons...
koa教程2 用户登录
登录类型用户注册之后,自然是用户登录,登录的时候我们需要考虑到登录的方式,往往在正式的项目里面,登录的方式可能会有很多种:账号密码登录手机号登录小程序一键登录那么我们登录的时候就要进行判断,设置一个type的属性,用于在登录时判断用户是什么类型的登录,这个由前端那边设定参数。type:1为账号密码登录,2为手机号登录,3为小程序一键登录作为判断,我们可以写一个查询表(枚举),在项目根目录创建一个lib目录,在里面创建一个enum.js文件。enum.js://通用判断是否存在该类型 function isThisType(val) { let flag = false; Obje...
node 自定义路径别名
用过vue cli的话,对路径中的@应该不陌生,他表示根目录,但是在node的环境里面,我们编写模块并引入时,并没有这种方便的写法。在node环境中,我们可以通过process.cwd()来表示根目录,但是这样的话,每次使用绝对路径引入,路径总是需要写一大堆拼接。const db = require(`${process.cwd()}/config/config`).database;这样略显麻烦,于是我们可以在全局写一个引入插件的方法:global.myRequire = function (path) { return require(`${process.cwd()}/${pa...