koa2 是什么

koa2 是 nodejs web server 框架

什么是框架 frame(类比 Vue)

  • 封装原生代码的 API
  • 规范流程和格式
  • 让开发人员更加关注于业务代码,提高开发效率

框架 frame 和库 lib 的区别

  • 框架是唯一的,库就可以共存
  • 框架关注全流程,库关注单个功能
  • 类比 Vue 和 lodash

koa2 是 nodejs web server 框架

  • 通过 async/await 语法高效编写 web server
  • 中间件机制,能合理拆分业务代码

koa2 安装和使用

  • 安装 npm install koa2 --save

koa2 环境搭建

  • 使用脚手架 koa-generator 创建 koa2 项目
npm install -g koa-generator
  • 介绍项目的目录和文件
  • 在项目中新建一个路由

koa2 生成项目

  • koa2 <项目目录>

路由的建立

// 路由文件 commons.js
const router = require('koa-router')()
router.prefix('/api')
router.get('/list', ctx => {
	ctx.body = 'this is list router'
})
module.exports = router
// app.js
// 1. 引入
const commons = require('./routers/commons')

// 2
app.use(commons.routes(), commons.allowedMethods())

如何接收和返回数据

  • ctx 即 res 和 req 的集合
  • querystring 的获取
// commons.js
router.get('/list', ctx => {
	const query = ctx.query
	console.log('query:', query)
	ctx.body = 'this is list router'
})
  • 获取 Request Body
router.post('/create', ctx => {
	const body = ctx.request.body
	console.log('body:', body)
	ctx.body = 'this is create router'
})
  • 返回 json 格式数据
router.get('/list', ctx = > {
	ctx.body = {
		errno: 0,
		data: [
			{ content: '留言1', name: '张三' },
			{ content: '留言2', name: '李四' },
			{ content: '留言3', name: '王五' }
		]
	}
})

路由上参数获取

router.get('/:id', async (ctx, next) => {
	console.log(ctx.params.id)
})

koa 中间件

什么是中间件

  • 一个流程上,独立的业务模块
  • 可扩展,可插拔
  • 类似于工厂的流水线

为什么使用中间件

  • 拆分业务模块,使代码清晰
  • 统一使用中间件,使得各业务代码都规范标准
  • 扩展性好,易添加、易删除

模拟登陆中间件

// app.js
app.use(async (ctx, next) => {
	const query = ctx.query
	if (query.user === 'zhangsan') {
		await next()
	} else {
		ctx.body = '请登录'
	}
})

koa2 洋葱圈模型

  • 中间件机制,是 koa2 的精髓
  • 每个中间件都是 async 函数
  • 中间件的运行机制,就像洋葱圈

koa2 中 cookie 的操作

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

app.use(async ctx => {
  ctx.cookies.set('c', 300)

  console.log(ctx.cookies.get('c'))

  ctx.body = 'cookie test1'
})

app.listen(3000)

koa2 实现 session

  • 使用 npm 插件 koa-generic-session
  • 使用 ctx.session

配置

// app.js
const session = require('koa-generic-session')
app.keys = ['session-koa2']		// 密钥
// 自动配置了 cookie 和 session
app.use(session({
	cookie: {
		path: '/',		// cookie 在根目录下有效
		httpOnly: true,				// cookie 只允许服务器端来操作
		maxAge: 24 * 3600 * 1000	// cookie 过期时间
	}
}))

使用

// routes/index.js
router.get('/session-test', async (ctx, next) => {
	if (ctx.session.viewcount === null || ctx.session.viewcount === undefined) {
		ctx.session.viewcount = 0
	}
	ctx.session.viewcount++

	ctx.body = {
		title: 'session-text',
		viewcount: ctx.session.viewcount
	}
})

单独某个路由使用中间件

// loginCheck 为中间件
router.get('/list', loginCheck, async (ctx, next) => {
	...
})

配置跨域

const cors = require('koa2-cors')
app.use(cors({
	origin: 'http://localhost:8080',	// 前端 origin
	credentials: true	// 允许跨域带 cookie
}))
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐