关于node.js:让nodejs开启服务更简单koa篇

在nodejs原始的http模块中,开启一个服务编码绝对麻烦,须要对申请形式及上传的数据进行各种判断,而koa给咱们提供了比拟便捷的编码方式,同时它还有很多中间件能够间接拿来应用。

首先来看,如何开启一个服务,装置koa,引入Koa构造函数,通过new来创立koa的实例对象,监听8000端口,通过use来解决客户端的申请,use解决的中间件有两个参数,ctx示意上下文,request和response都在ctx中,next示意执行下一个匹配的中间件。以下代码示意当申请形式为get时,响应后果hello world

const Koa = require('koa')
const app = new Koa()

app.use((ctx, next)=>{
  if(ctx.request.method === 'GET'){
    ctx.response.body = 'hello world'
  }
})

app.listen(8000, ()=>{ console.log('8000端口启动') })

koa自身比拟轻量,很多两头库都没有集成在koa外部,须要装置其余的库能力应用,首先罕用的就是 koa-router,router 能够自定义路由,可通过get / post 等办法间接调用

const Koa = require('koa')
const app = new Koa()
const Router = require('koa-router')
const userRouter = new Router({ prefix: '/user' })

app.use((ctx, next) => {
  next()
})

userRouter.post('/', (ctx, next)=>{
  ctx.response.body = 'post申请'
})

app.use(userRouter.routes())

app.listen(8000, () => { console.log('8000端口启动') })

在get、post或者其余申请中,通常会携带一些参数,而参数对于咱们接管申请返回响应也是十分重要的,get申请的参数通常有两种,分为query和params,query的形式是在url前面拼接问号和键值对的参数,相似于/user?name=kiki,params是在斜线前面增加参数,相似于 /user/1,这个数字1就是不固定的,能够由客户端传递的值,在koa-router中,都能够间接通过ctx.request对象中获取

const Koa = require('koa')
const app = new Koa()
const Router = require('koa-router')
const userRouter = new Router({ 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数据

const Koa = require('koa')
const app = new Koa()
const bodyParser = require('koa-bodyparser')
const Router = require('koa-router')
const userRouter = new Router({ prefix: '/user'})

app.use(bodyParser())

userRouter.post('/', (ctx, next)=>{
  ctx.response.body = ctx.request.body
})

app.use(userRouter.routes())

app.listen(8000, ()=>{console.log('开启8000端口')})

而解决以form-data格局发送的申请时,须要通过 koa-multer,通过导入的multer函数来创立upload对象,upload.any() 能够用来接口非文件的数据,upload.single() 传入form-data中的key值来解决上传的文件

const Koa = require('koa')
const app = new Koa()
const Router = require('koa-router')
const userRouter = new Router({ prefix: '/user'})
const multer = require('koa-multer')
const upload = 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('开启8000端口')})

在获取申请参数的过程中,可能存在参数不对须要进行报错提醒,这种状况能够把报错进行对立的解决,通过ctx中app去发射一个错误信息,并通过 on函数进行捕捉

const Koa = require('koa')
const app = new Koa()
app.use((ctx, next)=>{
  ctx.app.emit('error', new Error('请先登录'), ctx)
})

app.on('error', (err, ctx)=>{
  ctx.body = err.message;
})

app.listen(8000, ()=> {})

koa与原生的nodejs相比,简化简单的代码逻辑,让koa的编码更为简略,另一个框架express同样也能够简化编码,编码方式大同小异,能够看看这一篇,让nodejs开启服务更简略–express篇

【腾讯云】轻量 2核2G4M,首年65元

阿里云限时活动-云数据库 RDS MySQL  1核2G配置 1.88/月 速抢

本文由乐趣区整理发布,转载请注明出处,谢谢。

您可能还喜欢...

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据