node中间件-koa框架

文章目录

    • 1. koa 基本使用
    • 2. 参数解析
    • 3. 请求路径区分
    • 4. 路由
    • 5 参数解析
      • 5.1 params 与query解析
      • 5.2 body参数与urlencoded 解析
      • 5.3 form-data参数
    • 6 . 文件上传
    • 7. 静态服务器
    • 8 响应数据
    • 9 错误处理

1. koa 基本使用

  • 安装 npm i koa
  • koa导出的是一个类,必须用new关键字进行创建
  • koa也是通过注册中间件来完成请求操作的
const koa = require('koa');
//  导出的类,必须用new关键字
const app = new koa()
app.listen(8000, () => {console.log('koa 服务器启动~')
})//  使用koa这里传递两个参数 cxt 与next
app.use((cxt, next) => {console.log('匹配中间')cxt.body = '使用cxt中的body返回数据'
})

2. 参数解析

  • koa注册的中间件提供了两个参数:
  • ctx:上下文(Context)对象;
    • koa并没有像express一样,将req和res分开,而是将它们作为ctx的属性;
    • ctx代表一次请求的上下文对象;
    • ctx.request:获取请求对象;
    • ctx.response:获取响应对象;
  • next:本质上是一个dispatch,类似于之前的next;

注意点

  1. cxt 上下文有个请求对象一个是request既koa本身的对象,还有一个node 封装的请求对象:req
  2. 两个响应对象:cxt.response 是koa封装的响应式对象 ,txt.res 是node封装的响应式对象
app.use((cxt, next) => {/**  注意点 两个请求对象* @description:  cxt 上下文有两个请求对象一个是request既koa本身的对象,还有一个node封装的请求对象:req* @param {type} */cxt.request   // cxt.req/** 响应对象 两个响应对象* @description:  cxt.response 是koa封装的响应式对象* @param {type} txt.res 是node封装的响应式对象* @return: */cxt.body = '使用cxt中的body返回数据'
})

3. 请求路径区分

  • koa通过创建的app对象,注册中间件只能通过use方法:
    • Koa并没有提供methods的方式来注册中间件;
    • 也没有提供path中间件来匹配路径
  • 但是在开发中我们如何将路径和method分离呢?
    • 方式一:根据request自己来判断
    • 方式二:使用第三方路由中间件
// path
// app.use((cxt, next) => {
// 	if (cxt.path === '/users') {
// 	} else if (cxt.path === '/login') {
// 		cxt.body = '登录成功'
// 	} else { }
// })// method 
app.use((cxt, next) => {if (cxt.method === 'POST') {cxt.body = '登录成功'} else { }
})

4. 路由

  • 安装 npm install @koa/router
const koa = require('koa');
const router = require('@koa/router')const app = new koa()
// 1. 安装路由使用  npm i @koa/routerconst userRouter = new router({ prefix: '/users' })
//2. 注册路由中间件
userRouter.get('/', (cxt, next) => {cxt.body = '路由使用'
})userRouter.get('/:id', (cxt, next) => {const id = cxt.params.idconsole.log(id);cxt.body=id
})// 3. 路由生效  
app.use(userRouter.routes())
// allowedMethods路径或者方法匹配配置
app.use(userRouter.allowedMethods())
app.listen(8000, () => {console.log('koa 服务器启动~')
})

注意allowedMethods用于判断某一个method是否支持:某个请求或者路径是否正确

5 参数解析

  1. get params方式 例子:/:id
  2. get query方式 例子: ?name=admin&age=18
  3. post json方式 例子 {name:"admin" pass:123456}
  4. post x-www-form-urlencoded
  5. post form-data
  • 注意点 下面路由统一注册为users
const userRouter = new router({ prefix: '/users' })

5.1 params 与query解析

  • params参数 cxt.params.id
  • query参数 cxt.query
 userRouter.get('/:id', (cxt, next) => {const id = cxt.params.idcxt.body = id})userRouter.get('/', (cxt, next) => {const query = cxt.querycxt.body = query})

5.2 body参数与urlencoded 解析

  • 安装依赖: npm install koa-bodyparser;
  • 使用与注册 koa-bodyparser的中间件; app.use(bodyparser())
// 3. post/json  body参数
// 安装库  npm install koa - bodyparser
// app.use(bodyparser())
// userRouter.post('/', (cxt, next) => {
// 	 const body= cxt.request.body
// 	 cxt.body=body
// })// 4. urlencoded
app.use(bodyparser())
userRouter.post('/', (cxt, next) => {const body = cxt.request.bodycxt.body = body
})

5.3 form-data参数

  • 解析body中的数据,需要使用multer
  • 安装依赖:npm install koa-multer;
const upload =multer({})
app.use(upload.any())
app.use((cxt,next)=>{console.log(cxt.req.body);
})

6 . 文件上传

具体配置参考

const koa = require('koa');
const router = require('@koa/router')const multer = require('@koa/multer')
const app = new koa()app.listen(8000, () => {console.log('koa 服务器启动~')
})const userRouter = new router({ prefix: '/users' })
/*** 5. post form-data 
*/
let storage = multer.diskStorage({destination: (req, file, cb) => {cb(null, './uploads/')},filename: (ctx, file, cb) => {cb(null, file.originalname);}
});const upload = multer({storage
})userRouter.post('/', upload.single('file'), (cxt, next) => {})
// 5. form-data 解析  需要使用multer
app.use(userRouter.routes())

7. 静态服务器

  • koa并没有内置部署相关的功能,所以需要使用第三方库:
  • 安装依赖 npm install koa-static
const static=require("koa-static")
const app = new koa()
app.use(static('./upload'))

8 响应数据

  • 响应结果:body将响应主体设置为以下之一:
    • string :字符串数据
    • Buffer :Buffer数据
    • Stream :流数据
    • Object|| Array:对象或者数组
    • null :不输出任何内容
    • 如果response.status尚未设置,Koa会自动将状态设置为200或204
const userRouter = new router({ prefix: '/users' })
userRouter.post('/', (cxt, next) => {// 1.buffer 响应数据// cxt.body=Buffer.from('hello node')//  2. 文件流// const readerStream = fs.createReadStream('./upload/th5TYWK266.jpg')// cxt.type = 'image/jpeg'   // 请求展示图片// cxt.body = readerStream// 3.响应数组或者对象类型cxt.body={name:'admin',password:123456}
})

9 错误处理

  • 在做错误处理统一封装时:cxt上下文可以触发一个emit事件
  • 因此可以使用app.on进行监听事件
const koa = require('koa');
const router = require('@koa/router')
const app = new koa()
app.listen(8000, () => {console.log('koa 服务器启动~')
})
const userRouter = new router({ prefix: '/users' })userRouter.get('/', (cxt, next) => {const isAuth = falseif (isAuth) {cxt.body = '登录成功,返回token'} else {// cxt.body = {// 	code: 1001,// 	message: '没有进行授权'// }// 统一处理错误cxt.app.emit('errorEvent', 1001,cxt)}
})app.on('errorEvent', (code,cxt) => {let message = ''switch (code) {case 1001:message = '没有授权'breakdefault: 1002message = '成功'}const body = {code,message}cxt.body=body
})
app.use(userRouter.routes())

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/7119.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 用户组相关命令

添加用户组的命令是 groupadd,命令格式如下: [rootlocalhost ~]# groupadd [选项] 组名 选项: -g GID:指定组 ID;-r:创建系统群组。 使用 groupadd 命令创建新群组非常简单,例如: [rootlocalh…

Pytorch个人学习记录总结 05

目录 神经网络的基本骨架 卷积操作 torch.nn.functional.conv2d 神经网络的基本骨架 搭建Neural Network骨架主要用到的包是torch.nn,官方文档网址:torch.nn — PyTorch 2.0 documentation,其中torch.nn.Module很重要,是所有所…

springboot mybatis-plus 多数据源配置(HikariCP)

1.导入依赖jar <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>org.postgresql</groupId><artifactId>postgres…

【JVM】浅看JVM的运行流程和垃圾回收

1.JVM是什么 JVM&#xff08; Java Virtual Machine&#xff09;就是Java虚拟机。 Java的程序都运行在JVM中。 2.JVM的运行流程 JVM的执行流程&#xff1a; 程序在执行之前先要把java代码转换成字节码&#xff08;class文件&#xff09;&#xff0c;JVM 首先需要把字节码通过…

springboot中logback日志配置

springboot中logback日志配置 前言默认配置logback-spring.xml详细配置 前言 Spring Boot使用Apache的Commons Logging作为内部的日志框架&#xff0c;其仅仅是一个日志接口&#xff0c;在实际应用中需要为该接口来指定相应的日志实现。 Spring Boot从1.4版本开始内置的日志框…

程序员面试系列,kafka常见面试题

原文链接 Kafka是什么&#xff1f;它的主要作用是什么&#xff1f;什么是Kafka的主题&#xff08;Topic&#xff09;和分区&#xff08;Partition&#xff09;&#xff1f;Kafka中的消息是如何被生产者发送和消费者接收的&#xff1f;Kafka中的分区有什么作用&#xff1f;为什…

聊聊Linq中.AsEnumerable(), AsQueryable() ,.ToList(),的区别和用法

聊聊Linq中.AsEnumerable(), AsQueryable() ,.ToList(),的区别和用法 当使用LINQ查询数据时&#xff0c;我们常常会面临选择使用.AsEnumerable(), .AsQueryable(), 和 .ToList()方法的情况。这些方法在使用时有不同的效果和影响&#xff0c;需要根据具体场景来选择合适的方法。…

springboot热加载spring-boot-devtools:

springboot热加载 基于idea开发springboot项目使用热加载 pom依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</op…

金融领域:产业链知识图谱包括上市公司、行业和产品共3类实体,构建并形成了一个节点10w+,关系边16w的十万级别产业链图谱

项目设计集合&#xff08;人工智能方向&#xff09;&#xff1a;助力新人快速实战掌握技能、自主完成项目设计升级&#xff0c;提升自身的硬实力&#xff08;不仅限NLP、知识图谱、计算机视觉等领域&#xff09;&#xff1a;汇总有意义的项目设计集合&#xff0c;助力新人快速实…

前端 | ( 十三)CSS3简介及基本语法(下)| 伸缩盒模型 | 尚硅谷前端html+css零基础教程2023最新

学习来源&#xff1a;尚硅谷前端htmlcss零基础教程&#xff0c;2023最新前端开发html5css3视频 系列笔记&#xff1a; 【HTML4】&#xff08;一&#xff09;前端简介【HTML4】&#xff08;二&#xff09;各种各样的常用标签【HTML4】&#xff08;三&#xff09;表单及HTML4收尾…

Go 语言 值类型和引用类型

Go 语言 值类型和引用类型 值类型&#xff1a; 概述&#xff1a; 值类型的人变量直接存储其值&#xff0c;他们通常在栈上分配内存。当把一个值类型的变量赋值给另外一个变量、作为函数参数传递或从函数返回时&#xff0c;进行值的复制。因此每个变量都有自己独立的存储&…

Flutter 自定义 虚线 分割线

学习使用Flutter 进行 虚线 自定义控件 练习 // 自定义虚线 &#xff08;默认是垂直方向&#xff09; class DashedLind extends StatelessWidget {final Axis axis; // 虚线方向final double dashedWidth; // 根据虚线的方向确定自己虚线的宽度final double dashedHeight; //…

实训笔记7.24

实训笔记7.24 7.24笔记一、Hadoop中MapReduce框架的使用原理和流程1.1 涉及到一些框架核心组件1.1.1 InputFotmat1.1.2 MapTask1.1. 3Partitioner1.1.4 WritableComparable1.1.5 Combiner&#xff08;可选&#xff09;1.1.6 WritableComparator(GroupingComparator)1.1.7 Reduc…

c++ 之 dynamic_pointer_cast

/* * dynamic_pointer_cast */ 描述 (Description) 它返回一个正确类型的sp副本&#xff0c;其存储的指针从U *动态地转换为T *。 声明 (Declaration) 以下是std :: dynamic_pointer_cast的声明。 template <class T, class U> shar…

微服务保护——Sentinel【实战篇二】

一、线程隔离 &#x1f349; 线程隔离有两种方式实现&#xff1a; 线程池隔离信号量隔离&#xff08;Sentinel默认采用&#xff09; 线程隔离&#xff08;舱壁模式&#xff09;&#x1f95d; 在添加限流规则时&#xff0c;可以选择两种阈值类型&#xff1a; QPS&#xff1a;…

SpringBoot-4

Spring Boot 使用 slf4j 日志 在开发中经常使用 System.out.println()来打印一些信息&#xff0c;但是这样不好&#xff0c;因为大量的使用 System.out 会增加资源的消耗。实际项目中使用的是 slf4j 的 logback 来输出日志&#xff0c;效率挺高的&#xff0c;Spring Boot 提供…

NLP 中的pad/padding操作代码分析

今天分析一下NLP中的pad操作代码&#xff1a; 该方法的作用是将输入的序列列表seqs进行填充操作&#xff0c;使其具有相同的长度&#xff0c;以便进行批处理。填充使用指定的pad_token进行&#xff0c;并生成一个对应的mask标志列表&#xff0c;用于标记哪些部分是填充内容&am…

如何用3D格式转换工具HOOPS Exchange读取颜色和材料信息?

作为应用程序开发人员&#xff0c;非常希望导入部件的图形表示与它们在创作软件中的外观尽可能接近。外观可以在每个B-Rep面的基础上指定&#xff0c;而且&#xff0c;通过装配层次结构的特定路径可以在视觉外观上赋予父/子覆盖。HOOPS ExchangeHOOPS Exchange可捕获有关来自各…

新零售数字化商业模式如何建立?新零售数字化营销怎么做?

随着零售行业增速放缓、用户消费结构升级&#xff0c;企业需要需求新的价值增长点进行转型升级&#xff0c;从而为消费者提供更为多元化的消费需求、提升自己的消费体验。在大数据、物联网、5G及区块链等技术兴起的背景下&#xff0c;数字化新零售系统应运而生。 开利网络认为&…

让GPT人工智能变身常用工具-上

1.密码生成器:GPT为您创建安全密码 想象GPT作为您的个人密码生成器,负责从头到尾为您创建复杂且安全的密码。您只需要告诉他您的密码需求,比如密码的长度,是否包含大写字母、小写字母、数字或特殊字符,他会立即为您生成一个复杂但经过深度设计的密码。 例子: 我希望您…