手把手带你使用Node.js进行开发(三):浅谈Koa框架
引入
Koa框架是一个基于Node.js的轻量级Web框架,它是由Express框架的原班人马打造的,它提供了更简单更灵活的方式来构建和处理Web服务。
Koa介绍
Koa相对于Express而言,虽然不能实现更强的功能,但是可以更简单地完成功能。
- Koa的原理和内部结构很像Express,但是它的语法和内部结构进行了升级。
- Koa内部使用ES6编写, 它利用了ES6的一些新特性,例如箭头函数和类等。但它通常使用的是CommonJS模块规范。
- Koa的一大好处就是可以使用
async/await
函数来处理异步操作,帮我们丢弃了回调函数。其实最早的Koa就支持异步操作,只不过早期使用的是generator和co。 - 也正是由于Koa内部基于最新的异步处理方式,使得它处理异常更加简单。
- Koa中提供了
CTX
上下文对象,它实际上是包装了Node.js内部的request
和response
。 - Koa并没有捆绑任何中间件,而是提供了一套优雅的方法,帮助我们快速地编写服务器端应用程序。
使用
我们首先需要在我们的项目中安装Koa:
第一步,初始化一个node.js项目,创建一个package.json
文件
npm init -y
第二步,安装Koa
npm i koa
第三步,在项目文件中引入Koa
const Koa = require('koa') //引入Koa框架
const app = new Koa() //创建一个Koa实例
这里给大家演示一下如何用Koa启动一个简单的HTTP服务:
const Koa = require('koa')
const app = new Koa()
app.use(ctx => {
ctx.body = 'Hello World'
})
app.llisten(3000, () => {
console.log('listining on 3000')
})
在这段代码中,我们使用app.use
方法注册了一个中间件函数,中间件函数是用来处理HTTP请求和响应的(在后面我们会更详细地了解它),这个中间件函数会接受一个参数ctx
(context),它称为上下文对象,它包含了请求和响应的所有信息。
在这里,我们通过ctx.body
设置响应体,也就是服务器端返回给前端的内容,我们此时已经将内容设置为了'Hello World'
。
app.listen
也是Koa中的一个方法,它用来启动服务器并监听特定端口。在这个方法中,接收的第一个参数是我们想监听的端口号,第二个参数是一个回调函数,在服务器启动成功后会被调用,一般我们使用这个回调函数来创建执行日志。
现在,我们只要运行这个项目,就可以在控制台上打印出listining on 3000
,当我们去浏览器访问localhost:3000端口时,就能看到
这样,我们就启动了一个简单的HTTP服务。
Koa中的CTX上下文对象和中间件函数
现在我们来好好聊聊ctx和中间件。
CTX:
在Koa中,ctx
是一个上下文对象,它封装了node中的原生请求和响应对象(request和response),并且提供了很多函数和属性来辅助我们进行Web开发。
我们首先要清楚一点:在我们使用Koa进行开发时,每一个请求都会创建一个Context,而在同一个请求处理的过程中,可能会多次用到ctx,而ctx的状态会贯穿整个请求处理过程,也就是说,在同一个请求处理中,你不管在哪个中间件使用的ctx都是同一个,所以你可以在不同的中间件中共享信息。
ctx中一些常用的属性和方法:
ctx.request
--- 这是koa中的请求对象,我们可以从中获取到请求方法,URL和请求体等信息。如果你想使用原生node的request对象,需写ctx.req
。ctx.response
--- 这是koa中的响应对象,我们可以用它来设置响应的状态码,响应头和响应体等。如果你想使用原生node的response对象,需写ctx.res
。ctx.set()
--- 可以用于设置响应头。ctx.body
--- 可以用于设置响应体。ctx.status
--- 用于设置或者获取响应状态码。
中间件
中间件其实是一个异步函数,它会接收ctx
和next
作为参数,next()
可以控制中间件函数的执行流程,它会将控制权交给下一个中间件。
我们通常可以这样定义中间件函数:
const foo = async (ctx, next) => {
//执行某些操作
await next()
//这里也可以执行一些操作
}
定义完成之后,还要通过use()
方法去注册中间件。当然在定义和注册之前我们要先确保已经在项目中引入了Koa并创建了实例。
const Koa = require('Koa')
const app = new Koa()
app.use(foo) //注册中间件函数
中间件的执行流程其实也很简单,这里通过一个小demo让大家直观地了解:
const Koa = require('koa');
const app = new Koa()
const one = (ctx, next) => {
console.log(1);
next()
console.log(2);
}
const two = (ctx, next) => {
console.log(3);
next()
console.log(4);
}
const three = (ctx, next) => {
console.log(5);
next()
console.log(6);
}
app.use(one);
app.use(two);
app.use(three);
app.listen(3000, () => {
console.log('listening on 3000');
})
最后控制台输出结果为:
其实中间件的执行流程是这样的:
- 每当收到请求时,Koa就会从上到下依次执行中间件
- 当第一个中间件内部的语句执行到
next()
时,就会跳出去执行第二个中间件,并按照这个规则一直执行到最后一个中间件- 当最后一个中间件执行到
next()
时,它就会发现后面没有中间件了,于是它就会执行它的next()
后面的语句- 执行完成后,它会沿着刚刚的执行顺序,倒着把前面的中间件的
next()
后面的语句执行(回溯)。直到所有语句执行完毕。
对于这个流程还有一个很生动的模型---洋葱模型
总结
Koa提供的简洁高效的API,让我们可以用更少的代码实现一些复杂的业务逻辑。尤其是它强大的中间件系统,非常灵活。我们做一些中小型项目的时候用上Koa能更加游刃有余。
转载自:https://juejin.cn/post/7397617342162403338