一、Koa定义
Koa 是一个新的 Web 框架,致力于成为 web 应用和 API 开发领域中的一个更小、更富有表现力、更健硕的基石。
利用 async 函数丢弃回调函数,并增强错误处理。Koa 没有任务预设的中间件,可快速而愉快地编写服务端应用程序。
二、Koa 核心概念
(1)Koa Application(应用程序)
(2)Context(上下文)
(3)Request(请求)、Response(响应)
三、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);
);```