koa 开发服务端

本文详细介绍了Koa框架的使用,包括async/await的原理,Koa的特点,洋葱模型的执行顺序,以及Koa-router的用法。此外,还探讨了参数接收与校验、全局异常处理、数据库集成、Sequelize的运用、安全令牌token的生成与验证,以及跨域解决方案。通过阅读,读者将深入理解Koa服务端开发的核心概念和技术。
摘要由CSDN通过智能技术生成

一 async await

  • await 1.对promise求值;2.阻塞当前程序,等待结果
  • async 1.配合await使用;2.使函数返回promise

二 koa 特点

  • Koa是Node.js的一个开发框架,其最大的特点是精简和强大的中间件。
  • 在Koa中,一切的流程都是中间件,数据流向遵循洋葱模型,先入后出,是按照类似堆栈的方式组织和执行。
  1. 洋葱模型

来源:白话koa2的洋葱模型

1.一个请求一旦到后端,就开始接触洋葱的最外层。
2.遇到一个next(),就进入下一层。不过值得提醒的是,异步函数的next(),与同步函数的next(),不是在同一个空间的,我们可以假想一个“异步空间栈”,后入先出。
3.什么时候到洋葱中心?就是遇到的第一个没有next的中间件,或者遇到一个中间件报错,就会把这个中间件当成中心,因为遇到错误了,不会再继续往里面走。这个时候,就开始向洋葱的外层开始走了。如果第一个中间件就没有next,直接返回的。那么就不存在洋葱模型。
4.一层一层外面走的时候,就先走位所有的同步中间件,再依次走“异步空间栈”的中间件。
  1. 实例化的应用程序对象 有多个中间件
  2. 注册中间件,中间件本质就是个函数,接收前端发来的http请求,就需要用到中间件
  3. 永远只自动执行第一个中间件 第二个及之后 用参数next()执行
  4. 中间件next()返回是Promise
  5. 上下文ctx (Context),可用作中间件之间传值。
    ctx.req:Node 的 request 对象.
    ctx.res:Node 的 response 对象.
    ctx.request:koa 的 Request 对象.
    ctx.response:koa 的 Response 对象.
const Koa = require('koa')
const app = new Koa()  

app.use((ctx, next) => {
   
	console.log(1)
	const a = next() // 返回Promise 
	console.log(2)
	console.log(ctx.r)
})

app.use((ctx, next) => {
   
	console.log(3)
	next()
	console.log(ctx.r)
	console.log(4)
})

app.use(async (ctx, next) => {
   
	console.log(5)
	const axios = require('axios')
	const res = await axios.get('https://www.baidu.com')
	ctx.r = res
	next()
	console.log(6)
})

app.listen(3000)

为什么 async await ???

  • 有人说使用async await是为了让每个中间件都返回Promise,这种说法是错误的,next()本身就返回 Promise,这是koa本身就具有的特性
  • 真正原因是为了保证洋葱模型的执行顺序,中间件必须用async await,例如前两个中间件没有使用,第三个因为有接口请求,就不能保证在执行完第三个中间件之后再打印4

为什么 洋葱模型 ???

  • 如上示例,假如第一个中间件要拿到第三个中间件的res,简单的可以用return,一次返回到第二个中间件,第一个中间件,但前提条件是这些中间件都是自己编写的,假如第二个中间件是第三方的,那么返回到第二个中间件,我们不可能改写第三方的代码,致使第一个中间件拿不到res。

  • 用上下文ctx传值,第三个中间件把res存到ctx中,因为axios使代码异步执行,如果不能保证洋葱模型,那么在第二个中间件是拿不到res的。

    所以,必须保证洋葱模型!!!

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

// logger
app.use(async (ctx, next) => {
   
  await next();
  const rt = ctx
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值