参数

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里面使用这个变量,都可以的。

分类: Node 标签: router路由nodekoa

评论

暂无评论数据

暂无评论数据

目录