官网定义:
Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石。 通过利用 async 函数,Koa 帮你丢弃回调函数,并有力地增强错误处理。 Koa 并没有捆绑任何中间件, 而是提供了一套优雅的方法,帮助您快速而愉快地编写服务端应用程序。
需要注意的是,在引入Koa的时候定义的变量建议首字母大写,因为引入进来的Koa是一个构造函数,与之对比express的小写不同,express引入进来的是一个方法。
-
Koa的安装
npm install koa
-
Koa的上下文对象
Koa与express在此处也是有不同的地方的,Koa的参数中有一个ctx对象,全称是context(上下文对象),该对象中有很多请求对象和响应对象的属性,而express则是request和response对象。
所有的context对象中存在的属性
{
"request": {
"method": "GET",
"url": "/",
"header": {
"host": "localhost:3000",
"connection": "keep-alive",
"cache-control": "max-age=0",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"99\", \"Google Chrome\";v=\"99\"",
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": "\"Windows\"",
"upgrade-insecure-requests": "1",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.82 Safari/537.36",
"accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
"sec-fetch-site": "none",
"sec-fetch-mode": "navigate",
"sec-fetch-user": "?1",
"sec-fetch-dest": "document",
"accept-encoding": "gzip, deflate, br",
"accept-language": "zh-CN,zh;q=0.9",
"cookie": "iuuid=4A6BA4B09FA911EBA94155995BDE1980F51D01EB2506461C9D1BF46E6BD25428; ci=70%2C%E9%95%BF%E6%B2%99; Idea-27a01726=250b0cc9-2f91-456f-83fd-66b3dff3918e; Webstorm-c53c985b=b15edf29-a690-4fb1-a5bd-88d2878d8a56; SECKEY_ABVK=jMUoQpA+5zzQgKXv6AnOLZbxz5WrzCuZXMJxC5QJC/E%3D; BMAP_SECKEY=AOPUfxtQBFx_D_6foKit2bazjnrEcFzzNmJl9eJeOnrWvmntrgnn-iMB2UQeFQupVAafGctwrk9ix-Am92bVty4JxMv4RJesowbLSnJfHcIzQ2lPgHISfc8UJAyv17ks_1W8cPtpHrVSQwwT9ZY-vbaQ1Ic88ykE0s8g3-caMyOnt_UR854OuvjWPqRQ-CKS"
}
},
"response": {
"status": 200,
"message": "OK",
"header": {
"content-type": "application/json; charset=utf-8"
}
},
"app": {
"subdomainOffset": 2,
"proxy": false,
"env": "development"
},
"originalUrl": "/",
"req": "<original node req>",
"res": "<original node res>",
"socket": "<original node socket>"
}
代码示例:
const Koa = require('koa');
const app = new Koa;
/**
* ctx 上下文对象(也就是说当前的作用环境)
* ctx : {
* response 响应对象
* request 请求对象
* body 指的就是response.body, 向前端发送数据
* ...
* 其他的属性很多是请求对象和响应对象中比较常用的属性
* }
*/
app.use((ctx , next) => {
ctx.response.body = 'hello';
})
app.listen(3000, () => console.log('http://localhost:3000'))
-
Koa的app应用程序挂载到其他服务器上
如果使用Koa的时候不想在Koa代码内去挂载端口,那么可以导出一个app,然后通过Koa自带的app.callback()
回调函数去执行,挂载至其他外部服务器上去。
// 认识koa与上下文对象
const Koa = require('koa');
const app = new Koa;
/**
* Koa的callback()函数
* 可以将当前app应用程序挂载到其他服务器上
*/
app.use((ctx, next) => {
ctx.body = `<h1>首页状态</h1>`
})
// 导出app
module.exports = app;
然后我们通过原生node的HTTP内置模块监听一个5000端口写一个服务器,再将导出的app应用程序挂载到这个端口上来
const http = require('http');
const app = require('./index.js');
http.createServer(
app.callback()
).listen(5000, () => console.log('http://localhost:5000'))
-
错误程序处理
通过使用app.on('error', (err, ctx) => { })
去监听错误信息
const Koa = require('koa');
const app = new Koa;
app.use((ctx, next) => {
throw new Error('程序抛异常')
ctx.body = `<h1>首页状态</h1>`
})
/**
* error 错误处理
*/
app.on('error', (err, ctx) => {
console.log(err)
})
app.listen(3000, () => console.log('http://localhost:3000'))
-
模块路由
路由是一个URL和一个特定的HTTP方法组成,涉及到应用如何响应客户端对某个网站节点的访问
也就是说:路由即根据不同的URL地址,加载不同的页面实现不同的功能。
Koa路由和Express的路由有区别的,在Exprss中直接引入Express就可以配置路由了,但是在Koa中我们需要安装对应的koa-router来实现
安装koa-router
npm install --save koa-router
创建并使用路由
共分为4步骤:
第一步:导入koa-router
第二步:创建实例化对象
第三步:生成路由
第四步:将路由挂载到应用程序
const Koa = require('koa');
const app = new Koa;
// 第一步:导入koa-router
const Router = require('koa-router')
// 第二步:创建实例化对象
const router = new Router;
// 第三步:生成路由
router.get('/', (ctx, next) => {
ctx.body = '首页'
})
// 第四步:将路由挂载到应用程序
app.use(router.routes())
app.use(router.allowedMethods())
app.listen(3000, () => console.log('http://localhost:3000'))
父子路由的模块化使用
创建一个routes目录,下面分别新建一个student.js和teacher.js用于存放学生路由和教师路由文件
// 学生的路由模块
const Koa = require('koa');
const app = new Koa;
const Router = require('koa-router');
const studentRouter = new Router;
studentRouter.get('/student', (ctx, next) => {
ctx.body = '学生首页'
})
studentRouter.get('/student/add', (ctx, next) => {
ctx.body = '新增学生首页'
})
studentRouter.get('/student/delete', (ctx, next) => {
ctx.body = '删除学生首页'
})
studentRouter.get('/student/update', (ctx, next) => {
ctx.body = '更新学生首页'
})
studentRouter.get('/student/serach', (ctx, next) => {
ctx.body = '查询学生首页'
})
module.exports = studentRouter;
// 老师的路由模块
const Koa = require('koa');
const app = new Koa;
const Router = require('koa-router');
const teacherRouter = new Router;
teacherRouter.get('/teacher', (ctx, next) => {
ctx.body = '老师首页'
})
teacherRouter.get('/teacher/add', (ctx, next) => {
ctx.body = '新增老师首页'
})
teacherRouter.get('/teacher/delete', (ctx, next) => {
ctx.body = '删除老师首页'
})
teacherRouter.get('/teacher/update', (ctx, next) => {
ctx.body = '更新老师首页'
})
teacherRouter.get('/teacher/serach', (ctx, next) => {
ctx.body = '查询老师首页'
})
module.exports = teacherRouter;
然后我们在主应用程序只需要去引入这两个路由模块即可
const Koa = require('koa');
const app = new Koa;
// 引入学生路由模块
const studentRouter = require('./routes/student.js')
app.use(studentRouter.routes(), studentRouter.allowedMethods())
// 引入教师路由模块
const teacherRouter = require('./routes/teacher.js')
app.use(teacherRouter.routes(), teacherRouter.allowedMethods())
app.listen(3000, () => console.log('http://localhost:3000'))
图1.png
-
路由传值
Koa2中get传值通过request接收,接收的方法有两种:query和querystring
1、query: 返回的是格式化好的参数对象
2、querystring: 返回的是请求字符串
router.get('/', async (ctx, next) => {
console.log(ctx.query) // 一般使用这个
console.log(ctx.querystring)
console.log(ctx.request.query)
console.log(ctx.request.querystring)
})
-
静态资源目录static中间件
其实router以及static对于koa来说都算是一个内置的中间件
app.use(static())
网友评论