美文网首页
Koa基础入门

Koa基础入门

作者: 北风吹_yfy | 来源:发表于2021-01-18 19:02 被阅读0次

一、Koa定义

Koa 是一个新的 Web 框架,致力于成为 web 应用和 API 开发领域中的一个更小、更富有表现力、更健硕的基石。
利用 async 函数丢弃回调函数,并增强错误处理。Koa 没有任务预设的中间件,可快速而愉快地编写服务端应用程序。

二、Koa 核心概念

(1)Koa Application(应用程序)
(2)Context(上下文)
(3)Request(请求)、Response(响应)


image.png
image.png

三、Koa 特点

(1)简洁
只需要通过添加中间件对数据进行处理
(2)async/await
(3)丰富的中间件

四、安装

Koa 依赖 node v10.16.0 或 ES2015及更高版本和 async 方法支持。

$ nvm install 10.16.0
$ npm i koa
$ node my-koa-app.js

npm会把koa以及koa依赖的所有包全部安装到当前目录的node_modules目录下。
注意,任何时候都可以直接删除整个node_modules目录,因为用npm install命令可以完整地重新下载所有依赖。并且,这个目录不应该被放入版本控制中。

五、使用

Express是第一代最流行的web框架,它对Node.js的http进行了封装,用起来如下:

var express = require('express');
var app = express();

app.get('/', function (req, res) {
    res.send('Hello World!');
});

app.listen(3000, function () {
    console.log('Example app listening on port 3000!');
});

虽然Express的API很简单,但是它是基于ES5的语法,要实现异步代码,只有一个方法:回调。如果异步嵌套层次过多,代码写起来就非常难看.和Express相比,koa 1.0使用generator实现异步,代码看起来像同步的:

var koa = require('koa');
var app = koa();

app.use('/test', function *() {
    yield doReadFile1();
    var data = yield doReadFile2();
    this.body = data;
});

app.listen(3000);

koa2完全使用Promise并配合async来实现异步。

app.use(async (ctx, next) => {
    await next();
    var data = await doReadFile();
    ctx.response.type = 'text/plain';
    ctx.response.body = data;
});

对于每一个http请求,koa将调用我们传入的异步函数来处理:

async (ctx, next) => {
    await next();
    // 设置response的Content-Type:
    ctx.response.type = 'text/html';
    // 设置response的内容:
    ctx.response.body = '<h1>Hello, koa2!</h1>';
}

其中参数ctx是由koa传入的封装了request和response的变量(简称执行期上下文)可以通过它访问request和response,next是koa传入的将要处理的下一个异步函数。

六、 koa middleware(中间件)

koa的执行逻辑的核心代码是:

app.use(async (ctx, next) => {
    await next();
    ctx.response.type = 'text/html';
    ctx.response.body = '<h1>Hello, koa2!</h1>';
});

每收到一个http请求,koa就会调用通过app.use()注册的async函数,并传入ctx和next参数。
koa把很多async函数组成一个处理链,每个async函数都可以做一些自己的事情,然后用await next()来调用下一个async函数。我们把每个async函数称为middleware,这些middleware可以组合起来,完成很多有用的功能。

处理URL(koa-router)

为了处理URL,我们需要引入koa-router这个middleware,让它负责处理URL映射。

安装
npm i -S koa-router
使用
const Koa = require('koa');

// 注意require('koa-router')返回的是函数:
const router = require('koa-router')();
/*
    上面语句可以写成如下:
    const Router = require('koa-router');
    const router = new Router();
*/
const app = new Koa();

// log request URL:
app.use(async (ctx, next) => {
    console.log(`Process ${ctx.request.method} ${ctx.request.url}...`);
    await next();
});

// add url-route:
router.get('/hello/:name', async (ctx, next) => {
    var name = ctx.params.name;
    ctx.response.body = `<h1>Hello, ${name}!</h1>`;
});

router.get('/', async (ctx, next) => {
    ctx.response.body = '<h1>Index</h1>';
});

// add router middleware:
app.use(router.routes());

app.listen(3000);
console.log('app started at port 3000...');

合并路由 koa-combine-routers

用于组合koa-router的多个实例。

安装
npm i -S koa-combine-routers
使用
  • app.js
const Koa = require('koa')
const router = require('./routes')
 
const app = new Koa()
 
app.use(router())
  • routes.js
const Router = require('koa-router')
const combineRouters = require('koa-combine-routers')
 
const dogRouter = new Router()
const catRouter = new Router()
 
dogRouter.get('/dogs', async ctx => {
  ctx.body = 'ok'
})
 
catRouter.get('/cats', async ctx => {
  ctx.body = 'ok'
})
 
const router = combineRouters(
  dogRouter,
  catRouter
)
 
module.exports = router

静态资源koa-static

如果网站提供静态资源(图片、字体、样式表、脚本......),为它们一个个写路由就很麻烦,也没必要。koa-static模块封装了这部分的请求。

安装
npm i -S koa-static
使用
const {join} = require('path') //用于拼接路径
const static = require('koa-static')
app.use(static(join(__dirname,'static','静态文件夹')))

打印日志koa-logger

安装
npm i -S koa-logger

要注册为第一个中间件

app.use(logger())

koa-body

该模块可以解析post也支持解析表单和文件上传

安装
npm i -S koa-body
使用
const koaBody = require('koa-body');
app.use(koaBody())

@koa/cors(koa的跨源资源共享(CORS))

安装
npm i -S @koa/cors@2
使用
const Koa = require (' koa ') ;  
const cors = require('@koa/cors');
const app = new Koa(); 
app.use(cors())

配置Access-Control-Allow-Origin CORS头。期待一个字符串(例如:http://example.com)。设置为true反映请求来源,如下所定义req.header('Origin')。设置false为禁用CORS。也可以设置为一个函数,它将请求作为第一个参数。

koa-views

koa-views 是一个视图管理模块,它的灵活度很高,支持很多的模版引擎,这里我们给它配置的引擎是 ejs。

安装
npm i -S koa-views
使用
const views = require('koa-views')
const path = require('path')

// 配置视图
app.use(views(path.join(__dirname, './views'), {
    extension: 'ejs'
}))

安全头 koa-helmet

它提供了重要的安全标头,默认情况下可使您的应用程序更安全。

安装
yarn add koa-helmet
// 或者
npm install koa-helmet --save
使用
// 入口文件
app.use(helmet());

错误处理

500 错误
如果代码运行过程中发生错误,我们需要把错误信息返回给用户。HTTP 协定约定这时要返回500状态码。Koa 提供了ctx.throw()方法,用来抛出错误,ctx.throw(500)就是抛出500错误。
404错误
如果将ctx.response.status设置成404,就相当于ctx.throw(404),返回404错误。
处理错误的中间件
为了方便处理错误,最好使用try...catch将其捕获。但是,为每个中间件都写try...catch太麻烦,我们可以让最外层的中间件,负责所有中间件的错误处理。
error 事件的监听
运行过程中一旦出错,Koa 会触发一个error事件。监听这个事件,也可以处理错误。

app.on('error', (err, ctx) =>
  console.error('server error', err);
);```

相关文章

  • koa2入门系列

    koa2入门系列(一) koa2入门系列(二) koa2入门系列(三) koa2入门系列(四) koa2入门系列(...

  • Koa基础入门

    一、Koa定义 Koa 是一个新的 Web 框架,致力于成为 web 应用和 API 开发领域中的一个更小、更富有...

  • Koa2 入门 Koa-body Koa-router

    Koa 入门 koa需要搭配中间件来做接口更方便,使用Koa-body & Koa-router 首先使用npm下...

  • nuxt

    一、koa基础知识 koa-generator koa2脚手架创建项目:koa2 -e project -e表示...

  • 关于Node框架选择

    1.WEB框架演进 Express --> Koa --> Koa2 2. Node 调试工具入门教程 http:...

  • Koa2+Nunjucks的实例介绍

    知识准备 koa入门: koa2使用的结构 什么是middleware? middleware顺序的重要性 整理笔...

  • koa2入门

    【链接】koa入门https://www.liaoxuefeng.com/wiki/001434446689867...

  • koa实现简单图片上传

    搭建koa基础结构 新建一个文件夹 执行npm init -y 安装koa koa-router 新建app.js...

  • koa 洋葱模型

    分析 1、首先这是koa2最简单的入门例子,我将通过这个入门例子来演示koa2的洋葱模型 在这里面,app首先是调...

  • Koa入门

    介绍 koa是一个相对于Express来说,体积更小,更富有表现力的Web框架。你可以选择(或者自己写一个)中间件...

网友评论

      本文标题:Koa基础入门

      本文链接:https://www.haomeiwen.com/subject/cklxzktx.html