likes
comments
collection
share

手把手带你使用Node.js进行开发(三):浅谈Koa框架

作者站长头像
站长
· 阅读数 15

引入

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内部的requestresponse
  • 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端口时,就能看到

手把手带你使用Node.js进行开发(三):浅谈Koa框架

这样,我们就启动了一个简单的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 --- 用于设置或者获取响应状态码。

中间件

中间件其实是一个异步函数,它会接收ctxnext作为参数,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');
})

最后控制台输出结果为:

手把手带你使用Node.js进行开发(三):浅谈Koa框架

其实中间件的执行流程是这样的:

  • 每当收到请求时,Koa就会从上到下依次执行中间件
  • 当第一个中间件内部的语句执行到next()时,就会跳出去执行第二个中间件,并按照这个规则一直执行到最后一个中间件
  • 当最后一个中间件执行到next()时,它就会发现后面没有中间件了,于是它就会执行它的next()后面的语句
  • 执行完成后,它会沿着刚刚的执行顺序,倒着把前面的中间件的next()后面的语句执行(回溯)。直到所有语句执行完毕。

对于这个流程还有一个很生动的模型---洋葱模型

手把手带你使用Node.js进行开发(三):浅谈Koa框架

总结

Koa提供的简洁高效的API,让我们可以用更少的代码实现一些复杂的业务逻辑。尤其是它强大的中间件系统,非常灵活。我们做一些中小型项目的时候用上Koa能更加游刃有余。

转载自:https://juejin.cn/post/7397617342162403338
评论
请登录