当前位置: 首页 > 后端技术 > Node.js

nodejs启动服务更简单——koa文章

时间:2023-04-03 13:33:06 Node.js

nodejs原有的http模块中,启动一个服务代码比较麻烦,需要对请求方式和上传数据做各种判断,而koa为我们提供了一种更方便的编码方式,它也有很多可以直接使用的中间件。我们先看看如何启动一个服务,安装koa,引入koa构造函数,通过new创建一个koa实例对象,监听8000端口,通过use处理客户端请求。use处理的中间件有两个参数,ctx表示context,request和response都在ctx中,next表示执行下一个匹配的中间件。以下代码表示请求方法为get时,响应结果为helloworldconstKoa=require('koa')constapp=newKoa()app.use((ctx,next)=>{if(ctx.request.method==='GET'){ctx.response.body='helloworld'}})app.listen(8000,()=>{console.log('8000portstarted')})koa本身就是比较轻量级,还有很多中间库没有集成在koa内部,需要安装其他库才能使用。第一个常用的是koa-router。Router可以自定义路由,可以通过get/post等方法直接调用constKoa=require('koa')constapp=newKoa()constRouter=require('koa-router')constuserRouter=newRouter({prefix:'/user'})app.use((ctx,next)=>{next()})userRouter.post('/',(ctx,next)=>{ctx.response.body='postrequest'})app.use(userRouter.routes())app.listen(8000,()=>{console.log('8000portstart')})在get、post或者其他请求中,通常会携带一些参数,参数对于我们接收请求和返回响应也是非常重要的。get请求的参数通常有两种,分为query和params,query的方式是在url后面拼接问号和键值对,类似/user?name=kiki,params是加上斜杠后面的参数,类似/user/1,1这个数字不固定,客户端可以传的值,在koa-router中,可以直接通过ctx.request对象获取constkoa=require('koa')constapp=newKoa()constRouter=require('koa-router')constuserRouter=newRouter({prefix:'/user'})app.use((ctx,next)=>{next()})userRouter.get('/:id',(ctx,next)=>{ctx.response.body={query:ctx.request.query,params:ctx.request.params}})app.use(userRouter.routes())app.listen(8000,()=>{console.log('8000端口开始')})对于post请求,常用的方式有json、urlencoded和表单上传的form-data。前两者可以通过koa-bodyparser进行处理,在request.body中获取解析后的json数据constKoa=require('koa')constapp=newKoa()constbodyParser=require('koa-bodyparser')constRouter=require('koa-router')constuserRouter=newRouter({prefix:'/user'})app.use(bodyParser())userRouter.post('/',(ctx,next)=>{ctx.response.body=ctx.request.body})app.use(userRouter.routes())app.listen(8000,()=>{console.log('openport8000')})在处理form-data格式发送的请求时,需要使用koa-multer通过导入的multer函数创建上传对象,upload.any()可以用来接口非文件数据,upload.single()传入form-data中的key值来处理上传的文件constKoa=require('koa')constapp=newKoa()constRouter=require('koa-router')constuserRouter=newRouter({prefix:'/user'})constmulter=require('koa-multer')constupload=multer()userRouter.post('/',upload.single("file"),(ctx,next)=>{ctx.response.body={body:ctx.req.body,file:ctx.req.file}})app.use(userRouter.routes())app.listen(8000,()=>{console.log('Openport8000')})在获取请求参数的过程中,可能出现参数不正确,需要错误提示被报告。这种情况下可以统一处理报错,通过app在ctx信息中传递错误,通过on函数constKoa=require('koa')constapp=newKoa()app.use((ctx,next)=>{ctx.app.emit('error',newError('请先登录'),ctx)})app.on('error',(err,ctx)=>{ctx.body=err.message;})app.listen(8000,()=>{})koa相对于原来的nodejs,简化了复杂的代码逻辑,让koa的编码更加简单。另外一个frameworkexpress也可以简化编码。编码方法类似。可以阅读这篇文章让nodejs启动服务更简单——快手篇