我转过几个弯 绕过那个小雨楼
拿着蒲扇摆着衣衫渡着紧箍咒
不问天涯不停留 喝过几壶酒
不过年少白头道义放胸口
倘若明天之后 遥看前尘剑封侯
似那天上神仙无所求
朝朝暮暮君如梦醒十分不为何理由
是真是假是惶恐是无休
路过这风雨花满楼 片刻都不停留
我本这书生进京赶考留下许多愁
你问有没有时候 我叹这天道默悠悠
能否与我一醉方休
又过了几个弯 算尽天量道莫慌
踏这田园闻这芳草香
跌跌撞撞仗剑天涯折煞不枉无笔良
是梦是幻是温柔是家乡
路过这风雨花满楼 片刻都不停留
我本这书生进京赶考留下许多愁
你问有没有时候 我叹这天道默悠悠
能否与我一醉方休
路过这风雨花满楼 片刻都不停留
我本这书生进京赶考留下许多愁
你问有没有时候 我叹这天道默悠悠
能否与我一醉方休
谁能与我一醉方休
koa框架14 路由参数、重定向、嵌套
参数
koa-router的参数和vue中的router参数一下,一个分号带一个变量名
router.get("/news/:id",async ctx=>{
});
那么我们要进入这个路径,是一定要带上id的,不然就进不去:loaclhost:8080/news/1231
这个id可以是任何值,数字,英文,中文
参数也可以多个,这样你访问这个路径也要带上这么多的参数
router.get("/news/:id/:a/:eee",async ctx=>{
});
路径:localhost:8080/asda/ada/dada
如何获取这些参数呢?
ctx有一个params属性,他是一个对象,里面存储着所有的参数,键值对形式:
{
id:"asda",
a:"ada",
eee:"dada"
}
然后我们可以通过小标,key,解构,去获取这个对应的参数内容。
命名路由
这个和vue的命名路由差不多,也是给一个名字,以后路径发生变化,跳转用name也不会受到影响,但是用法略有不同。
router.get("news","/news/:id",async ctx=>{
});
第一个参数就是路由名了。
koa的路由跳转,他需要拼接出一条路径才行,他不想vue那样,直接push一个对象,对象里面带个name键值对就行。
他有一个专门凭借路径的方法:router.url("news",18)
;
然后他会返回一条路径:/news/18
此时,哪怕我原来的news的路由路径发生改变,只要路由名相同,我就能拼接出一条正确的路径。
重定向 慎用(301)
路由的重定向和ctx的重定向差不多,但是不一样,
因为路由的重定向默认使用301重定向。
router.redirect("/a","/b");
第一个参数是需要重定向的路径,第二个是301跳转到哪的路径
注意:路由的重定向不能改为302,不能像ctx的重定向那样我们可以修改。
嵌套
有时候网站做大了,对于路由我们可能需要做一个分类,比如,user为一个前缀,user前缀路径下要有login,singn两个子路由,还有有一个admin前缀,用于进入管理路由,admin下有list,banner两个子路由。
用户通过访问:/user/login
登录 /admin/list
查看数据列表
这就是路由的嵌套了,因为login,list这些都在一个父路由下
const Koa = require("koa");
const Router = require("koa-router");
const server = new Koa();
server.listen(8080);
//创建路由
const router = new Router();
//user路由
const user = new Router();
user.get("/login", async ctx => {
ctx.body = "登录";
});
user.get("/singn", async ctx => {
ctx.body = "注册";
});
router.use('/user',user.routes());
//admin
const admin = new Router();
admin.get("/list", async ctx => {
ctx.body = "数据列表";
});
admin.get("/banner", async ctx => {
ctx.body = "轮播数据";
});
router.use('/admin',admin.routes());
//主路由
server.use(router.routes());
new出一个新路由赋值给一个变量,然后这个变量设置对应的路由,然后通过主路由router的use方法,将这个new出的新路由的routes传入,并且设置一个对应的路径。
对于这个路径的生成,我们可以理解为字符串的拼接,也就是use第一个参数path+new出来的路由路径
第一个就是:
"/user"+"/login"
"/user"+"/singn"
所以需要注意一点就是:
"/"+"/xxx"
如果use设置了/
主路径,后面的子路由就不要再写/
了,不然字符的拼接会生成一个错误的路径。
要改为这样:
"/"+"xxx"
路由模块化
如果我们把路由全部写在server.js里面的话,路由一多,就会非常臃肿,所以我们要对其模块化处理。
我们可以对uer和admin两个路由作为一个js模块保存起来。
user
const Router = require("koa-router");
const router = new Router();
router.get("/login", async ctx => {
ctx.body = "登录";
});
router.get("/singn", async ctx => {
ctx.body = "注册";
});
module.exports = router.routes();
admin
const Router = require("koa-router");
const router = new Router();
router.get("/list", async ctx => {
ctx.body = "数据列表";
});
router.get("/banner", async ctx => {
ctx.body = "轮播数据";
});
module.exports = router.routes();
由于是在模块里面,是一个全新的作用域,所以我们可以直接使用router变量名也不用担心冲突。
最后通过module的exports导出路由的routes方法,然后直接在主路由里面激活就行了。
//user路由
router.use('/user', require("./router/user"));
//admin
router.use("/admin", require("./router/admin"));
如果项目再多了,这种主路由激活的也会变多,可能会有很多类似于user,admin这样额路由需要激活,这样server.js文件又会变得臃肿,我们可以将这些激活的路由丢到一个index.js文件内,然后在server文件中只需要引入这个存放index的目录即可。
比如在router文件夹内创建一个index.js
const Router = require("koa-router");
//创建路由
const router = new Router();
//user路由
router.use('/user', require("./user"));
//admin
router.use("/admin", require("./admin"));
//导出
module.exports = router.routes();
由于admin和user的路由文件也在router目录,我么调整了下文件路径,然后我们导出这个主路由的routes方法。
接着再去server.js中激活主路由
const Koa = require("koa");
const server = new Koa();
server.listen(8080);
server.use(require("./router"));
在server中我们已经你不需要引入koa-router了,然后直接use中require引入目录地址,node会自动获取index.js
当然我们也可以传统一点,用const创建一个变量,再去use里面使用这个变量,都可以的。
评论(0)