苏莉koa 2020-01-29
上一节文末参考的文章我们可以了解到:
在koa
实例化之后,我们会使用use
来加载中间件;
每一个中间件都是一个函数,函数的参数分别是ctx
和next
;
建立好http服务器之后,koa-compose
会将中间件存放在一个数组中,并依次从数组中执行每一个函数;
每一个中间函数会调用next方法去取下一个中间件函数继续执行,且每一个中间件都会返回一个promise
对象。
此时我们无论在浏览器输入什么路径,打印的都是一样的内容,因为使用的是同一个中间件。
http://localhost:3000/loginhttp://localhost:3000/book/gethttp://localhost:3000/book/edit...
修改以下代码:
const Koa = require(‘koa‘); const app = new Koa(); ? app.use(async (ctx,next)=>{ if(ctx.path === ‘/‘){ console.log("主页"); }else if(ctx.path === ‘/book/edit‘){ console.log("编辑书本"); } await next(); }); ? app.listen(3000);
当访问http://localhost:3000
时打印的是“主页”;
当访问http://localhost:3000/book/edit
时打印的是“编辑书本”。
如果没写一个api都要这样判断的话代码会很冗余也很维护,此时我们就需要koa-router
了。
cnpm i koa-router --save const Koa = require(‘koa‘); const Router = require(‘koa-router‘); const app = new Koa(); const router = new Router(); ? router.get("/",(ctx,next)=>{ console.log("主页"); }); ? router.get("/book/edit",(ctx,next)=>{ console.log("编辑书本"); }); ? // router注册到app app.use(router.routes()); ? app.listen(3000);
最近在做商品小程序,所以准备自给自足自己开发一套api,所以此次开发的接口跟商城有关。
在postman中新建一个collection
取名为mall
,在mall
文件夹下新增名字为【首页】、【我的】、【购物车】等文件夹。(有些人喜欢用类别区分文件夹名字,我不是专业的,用页面区分文件夹名字)。在【首页】文件夹下新增三个requeset
。
修改代码:
使用postman请求
也许你的接口开发是针对多个项目的,比如我同时一起开发mall
和admin
两种接口,mall
接口应该都用mall
开头,admin
都应该用admin
开头。
修改代码为:
const router = new Router({prefix:‘/mall‘});
此时请求应该为:
http://localhost:3000/mall/banners
router.get("/banners/:id",(ctx,next)=>{ const params = ctx.params; ctx.body = params; });
访问 http://localhost:3000/mall/banners/1
router.get("/banners",(ctx,next)=>{ const query = ctx.query; ctx.body = query; });
访问 http://localhost:3000/mall/banners?id=2
router.get("/banners",(ctx,next)=>{ const header = ctx.header; ctx.body = header; });
访问 http://localhost:3000/mall/banners
并在postman的header
中添加id=3
cnpm i koa-bodyparser --save
const Koa = require(‘koa‘); const Router = require(‘koa-router‘); const bodyparser = require("koa-bodyparser"); const app = new Koa(); const router = new Router({prefix:‘/mall‘}); app.use(bodyparser ()); router.post("/banners",(ctx,next)=>{ const res = ctx.request.body; ctx.body = res; }); ? // router注册到app app.use(router.routes()); app.listen(3000);
如果使用form-data的话会获取不到参数,需要使用koa-multer
,后期有图片上传的接口的时候我们再研究。
之前使用 koa2 的时候,处理 post 请求使用的是
koa-bodyparser
,同时如果是图片上传使用的是koa-multer
。这两者的组合没什么问题,不过
koa-multer
和koa-route
(注意不是koa-router
) 存在不兼容的问题。
看到网上这段话,后期应该会使用koa-body