koa

koa

Koa是基于Node.js平台的下一代web开发框架,通过利用 async 函数,Koa 帮你丢弃回调函数,并有力地增强错误处理。 Koa 并没有捆绑任何中间件, 而是提供了一套优雅的方法,帮助您快速而愉快地编写服务端应用程序。

安装

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

$ nvm install 7
$ 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-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'
}))

错误处理

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);
);```

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值