node中间件-koa框架

文章目录

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

1. koa 基本使用

  • 安装 npm i koa
  • koa导出的是一个类,必须用new关键字进行创建
  • koa也是通过注册中间件来完成请求操作的
javascript 复制代码
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封装的响应式对象
javascript 复制代码
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自己来判断
    • 方式二:使用第三方路由中间件
javascript 复制代码
// 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
javascript 复制代码
const koa = require('koa');
const router = require('@koa/router')


const app = new koa()
// 1. 安装路由使用  npm i @koa/router

const userRouter = new router({ prefix: '/users' })
//2. 注册路由中间件
userRouter.get('/', (cxt, next) => {
	cxt.body = '路由使用'
})

userRouter.get('/:id', (cxt, next) => {
	const id = cxt.params.id
	console.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
javascript 复制代码
const userRouter = new router({ prefix: '/users' })

5.1 params 与query解析

javascript 复制代码
 userRouter.get('/:id', (cxt, next) => {
 	const id = cxt.params.id
 	cxt.body = id
 })
 userRouter.get('/', (cxt, next) => {
 	const query = cxt.query
 	cxt.body = query
 })

5.2 body参数与urlencoded 解析

  • 安装依赖: npm install koa-bodyparser;
  • 使用与注册 koa-bodyparser的中间件; app.use(bodyparser())
javascript 复制代码
// 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.body
	cxt.body = body
})

5.3 form-data参数

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

6 . 文件上传

具体配置参考

javascript 复制代码
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
javascript 复制代码
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
javascript 复制代码
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进行监听事件
javascript 复制代码
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 = false
	if (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 = '没有授权'
			break
		default: 1002
			message = '成功'
	}
	const body = {
		code,
		message
	}
	cxt.body=body
})
app.use(userRouter.routes())
相关推荐
崔庆才丨静觅4 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60615 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了5 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅5 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅5 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅6 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment6 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅6 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊6 小时前
jwt介绍
前端
爱敲代码的小鱼6 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax