Koa

小懵 -
Koa
Koanpm init -ynpm i koa2 --Spackage.json 配置启动脚本 "start": "node app.js"npm i nodemon -g "start": "nodemon app.js"

没有webpeck 翻译请不要使用import

使用导入koa实例化app对象编写中间件 async将中间件添加至应用 app.use 返回this 也就是app本身启动服务启动监听使用postman 或者 浏览器访问
// 一. 导入koa
const Koa = require('koa')
// 二. 实例化对象
const app = new Koa()
// 三. 编写中间件
app.use((ctx) => {
    // ctx context http 请求的上下文 ctx.body === ctx.response.body 
  ctx.body = 'hello Koa2'
})
// 四. 启动服务
app.listen(3000, () => {
  console.log('server is running on http://localhost:3000')
})
注意

如果没有通过ctx.body返回给客户端, 最终会得到Not Found

洋葱模型

与express 不同 express是所有中间件顺序执行结束后响应.koa遇见next后会跳出当前中间件,执行下一个中间件,直到没有next 然后回到上一个中间件执行next之后的代码,直到第一个。所以在use中, 一次只能接受一个函数做为参数

  app.use(async (ctx, next)=> {
    console.log(1);
    ctx.body='222';
    await next();
    // 想输出1 必须等待上面的next结束 记得画图
    console.log(1);
  })
  .use(async (ctx, next)=> {
    console.log(2);
    await next()
    console.log(2);
  })
  .use(async (ctx, next)=> {
    console.log(3);
    await next()
    console.log(3); 
  })
//输出 1 2 3 2 1
异步处理

如果中间件中存在一些异步的代码, Koa也提供了统一的处理方式. 首先, 我们要了解async await语法

1) async await语法

async: 声明异步函数

await: 后跟一个promise对象

如果要使用await, 需要在函数声明前加上async

2) 示例需求在middleware1中, 构造一个message = aa在middleware2中, 同步追加bb在middleware3中, 异步追加cc

最终在middleware1中, 通过body返回数据

中间件

顾名思义, 中间件就是在什么的中间

在请求和响应中间的处理程序

有时候从请求到响应的业务比较复杂, 将这些复杂的业务拆开成一个个功能独立的函数, 就是中间件

对于处理请求来说,在响应发出之前,可以在请求和响应之间做一些操作,并且可以将这个处理结果传递给下一个函数继续处理

中间件函数,帮助拆解主程序的业务逻辑,
并且每一个的中间件函数处理的结果都会传递给下一个中间件函数。
就好比工厂里流水线工人清洗一个箱子:
第一个人清洗侧面,第二个人清洗底面,第三个人清洗顶面,。。。
这条流水线结束后,箱子也就清洗干净了
各做各的,不相互影响,又彼此协作

image-20211208184728196

三. 路由1 什么是路由路由建立URL和处理函数(中间件)之间的对应关系主要作用: 根据不同的Method和URL返回不同的内容需求

根据不同的Method+URL, 返回不同的内容
要求:

Get 请求/, 返回'这是主页'Get 请求/users, 返回'这是用户页'

Post请求/users, 返回'创建用户'
原生实现

  //     一. 导入koa
  const Koa = require('koa')
  // 二. 实例化对象
  const app = new Koa()
  // 三. 编写中间件
  app.use((ctx) => {
    if (ctx.url == '/') {
      ctx.body = '这是主页'
    } else if (ctx.url == '/users') {
      if (ctx.method == 'GET') {
        ctx.body = '这是用户列表页'
      } else if (ctx.method == 'POST') {
        ctx.body = '创建用户'
      } else {
        ctx.status = 405 // 不支持的请求方法
      }
    } else {
      ctx.status = 404
    }
  })
  // 四. 启动服务
  app.listen(3000, () => {
    console.log('server is running on http://localhost:3000')
  })

原生书写代码的可维护性差,业务复杂,原生也不够友好。由此出现路由中间件

1) 路由中间件 npm i koa-router
提供了405 501状态 router.allowedMethods通过它来实现
4** 客户端错误 请求方式不支持
5** 服务器错误 服务器没有这种请求方式
在koa的基础上

1. 导入`koa-router`包
2. 实例化router对象
3. 使用router处理路由
4. 注册中间件
// app 入口文件
const Koa = require('koa2');
const Router = require('koa-router');
// 声明应用
const app = new Koa();
const router = new Router();

router.get('/', async ctx => {
   ctx.body = 'router'
})
// 注册中间件 router.routes()启动路由  router.allowedMethods()允许任意请求
app.use(router.routes(), router.allowedMethods())
  .listen (9000,()=>{
     console.log('serve start.....111');
 })

2) 路由重定向

路由入口文件中书写

router.redirect('/', '/home') 参数1 用户输入的 参数2是重定向的

3) 子路由

路由入口文件中书写

router.use ('/list', 第一层子路由list.routes(),list.allowedMethods())

4) 404无效路由

5) 错误处理

项目拆解

app.js 是入口文件,里面不要写路由的东西。创建一个路由文件夹,但是路由文件也需要拆分,index.js是路由的入口,只做重定向,其他的路由定义不同的js文件

特别申明:本文内容来源网络,版权归原作者所有,如有侵权请立即与我们联系(cy198701067573@163.com),我们将及时处理。

Tags 标签

node.js

扩展阅读

加个好友,技术交流

1628738909466805.jpg