Koa友情链接https://jspang.com/detailed?i...npminit-ynpmikoa2--Spackage.json配置启动脚本"start":"nodeapp.js"npminodemon-g"start":"nodemonapp.js"没有webpeck翻译,请不要使用import。优点使用koa编写web应用。通过组合不同的生成器,可以避免重复繁琐的回调函数嵌套,大大提高错误处理的效率。Koa应用程序是一个包含中间件数组的对象,中间件数组由一组Generator函数组成。这些函数负责HTTP请求的各种处理,比如生成缓存、指定代理、请求重定向等。这些中间件函数根据请求组成类似栈的结构,依次执行。Koa2开发需要Node.js,要求Node.js版本高于V7.6。因为node.js7.6全面支持async/await,如果你的版本太低,或者是windows系统,我告诉你最暴力的方法,直接下载新的安装包,重新安装,覆盖原来的安装位置。1使用importkoa实例化app对象编写中间件async并将中间件添加到applicationapp.use返回this,即app自己启动服务并启动监听使用postman或浏览器访问//1.importkoaconstkoa=require('koa')//2.实例化对象constapp=newKoa()//3.编写中间件app.use((ctx)=>{/*ctxcontexthttprequestcontextctx.body===ctx.response.bodyctx.request:是Koa2中对context的封装请求对象,使用起来更直观简单tx.req:是context提供的node.js原生HTTP请求对象,虽然不是这样直观,可以获得更多的内容,适合我们深入编程。*/ctx.body='helloKoa2'})//4.启动服务app.listen(3000,()=>{console.log('serverisrunningonhttp://localhost:3000')})注意如果没有通过ctx.body返回给客户端,最终会得到NotFound2。洋葱模型不同于快递。Express在所有中间件依次执行后响应。当koa遇到next时,会跳出当前的中间件,执行下一个中间件,直到没有next再回到上一个中间件执行next之后的代码,直到第一个。所以在使用中,一次只能接受一个函数作为参数app.use(async(ctx,next)=>{console.log(1);ctx.body='222';awaitnext();//wantOutput1一定要等到上面next结束才记得画console.log(1);}).use(async(ctx,next)=>{console.log(2);awaitnext()console.log(2);}).use(async(ctx,next)=>{console.log(3);awaitnext()console.log(3);})//输出123212.1异步处理如果有一些异步中间件,Koa也提供了统一的处理方式。首先,我们需要了解asyncawait语法1)asyncawait语法async:声明一个异步函数await:后接一个promise对象如果要使用await,需要在函数声明前加上async2)示例需求在middleware1,在middleware2中构造一个message=aa,在middleware3中同步追加bb,在middleware1中异步追加cc,通过body返回数据2.2中间件顾名思义,中间件是在request和response的中间,中间处理程序有时会很复杂业务从请求到响应。将这些复杂的业务分解成独立的功能意味着中间件可以在响应发出之前处理请求。中间做一些操作,将这个处理结果传递给下一个函数继续处理中间件函数,帮助拆解主程序的业务逻辑,每个中间件函数的处理结果都会传递给下一个中间件函数。这就像流水线工人在工厂清洁箱子:第一个人清洁侧面,第二个人清洁底部,第三个人清洁顶部。..这条管道结束后,盒子就会被清理干净。各司其职,互不干涉,相互配合。3.路由1什么是路由?不同的Method和URL返回不同的内容要求根据不同的Method+URL,返回不同的内容要求:getrequest/,return'thisisthehomepage'getrequest/users,return'thisistheuserpage'postrequest/users,返回'createuser'的原生实现//1.导入koaconstKoa=require('koa')//2.实例化对象constapp=newKoa()//3.编写中间件app.use((ctx)=>{if(ctx.url=='/'){ctx.body='这是主页'}elseif(ctx.url=='/users'){if(ctx.method=='GET'){ctx.body='这是用户列表页面'}elseif(ctx.method=='POST'){ctx.body='创建用户'}else{ctx.status=405//不支持的请求method}}else{ctx.status=404}})//4.启动服务app.listen(3000,()=>{console.log('serverisrunningonhttp://localhost:3000')})原生写代码可维护性差,业务复杂,原生不够友好。结果路由中间件路由中间件npmikoa-router提供了405501statusrouter.allowed方法来实现4**clienterror请求方法不支持5**servererrorserverdoesnothavethisrequestmethodinkoaBasics1.导入`koa-router`包2.实例化路由器对象3.使用router处理路由4.注册中间件//app入口文件constKoa=require('koa2');constRouter=require('koa-router');//declareapplicationconstapp=newKoa();constrouter=newRouter();router.get('/',asyncctx=>{ctx.body='router'})//注册中间件router.routes()开始路由router.allowedMethods()允许任何请求app.use(router.routes(),router.allowedMethods()).listen(9000,()=>{console.log('servestart.....111');})在路由入口文件中写入router.redirect('/','/home')进行路由重定向。参数1用户输入的参数2为重定向路由前缀。例如,在user.route.js中定义路由对象时,传入参数constrouter=newRouter({prefix:'/users'});forrouter.get('/')==>在/users子路由入口文件中实际写router.use('/list',一级子路由list.routes(),list.allowedMethods())404invalidrouting错误处理项目拆解app.js是入口文件,不要在里面写路由的东西。创建路由文件夹,但是路由文件也需要拆分。index.js是路由的入口,只做重定向,其他路由定义不同的js文件4参数分析1为什么很多场景需要后端解析请求的参数,作为数据库操作的条件。场景一前端想通过请求获取id=1的用户信息界面设计。GET/users/:id解决了。在GET请求中,可以通过route传递一些参数,可以通过params//GET/users/:id----根据id获取单个用户的信息,返回一个对象router。get('/:id',(ctx)=>{//解析id参数constid=ctx.params.idconstres=db.filter((item)=>item.id==id)if(!res[0])ctx.throw(404)ctx.body=res[0]})场景二前端想查询年龄在18-20岁之间的用户信息在GET请求中,如果传递参数以键值对的形式,可以通过查询获取//GET/users?start=18&end=20----获取所有用户信息,返回一个数组router.get('/',(ctx)=>{//ctx.query是ctx.request.query解析键值对参数的代理const{start=0,end=0}=ctx.queryconstres=db.filter((item)=>item.age>=start&&item.age<=end)//解析键值对res.length==0?ctx.throw(404):(ctx.body=res)})场景3front-结束注册,填写用户名,年龄,传给后台,后台需要解析数据,保存到数据库中。接口设计解决了Koa不支持body参数解析的问题,通常是借助社区中间件来实现。官方推荐koa-bodyparserkoa-body1)installationkoa-bodynpminstallkoa-body2)Registration//注册KoaBody中间件,解析请求体中的参数,挂载到ctx.request.bodyconstKoaBody=require('koa-body')app.use(KoaBody())3)使用ctx.request.body获取请求body中的数据汇总对于不同的Http请求,需要使用不同的方法来携带参数GET请求:POST/PUT/PATCH/DELET请求在URL中以键值对的形式传递:在请求体中传递5.错误handling是针对接口编程而言,错误处理是一个非常重要的环节。通过提供更友好的提示,可以提高错误定位的效率,提高代码的稳定性和可靠性。1原生错误处理一般Koa中的错误分为三类:404:当请求的资源找不到时,或者没有通过ctx.body返回,koa自动返回并手动抛出:500是通过ctx手动抛出.throw:RuntimeerrorKoa类继承了Emitter类,所以可以通过emit提交错误,使用on统一错误处理app.on('error',(err,ctx)=>{console.error(err)ctx.body=err})只能捕获ctx.app.emit的错误2使用中间件1)安装npmikoa-json-error2)使用基本使用consterror=require('koa-json-error')app.use(error())高级使用consterror=require('koa-json-error')app.use(error({format:(err)=>{return{code:err.status,message:err.message,result:err.stack}},postFormat:(err,obj)=>{const{result,...rest}=objreturnprocess.env.NODE_ENV=='production'?rest:obj},}))vscode调试节点代码节点启动程序
