首页 >> 大全

Koa与常用中间件的使用

2023-09-02 大全 37 作者:考证青年

1. Koa是什么?

Node.js 是一个异步的世界,官方 API 支持的都是 形式的异步编程模型,这会带来许多问题,例如 的嵌套问题 ,以及异步函数中可能同步调用 返回数据,可能会带来不一致性,为了解决以上问题 Koa 出现了。

Koa 是基于 Node.js 平台的下一代 web 开发框架。

Koa是由 原班人马打造的,致力于成为一个更小、更富有表现力、更健壮的 Web 框架。 使用 Koa编写 web 应用,可以免除重复繁琐的回调函数嵌套, 并极大地提升错误处理的效率。Koa不在内核方法中绑定任何中间件, 它仅仅提供了一个轻量优雅的函数库,使得编写 Web 应用变得得心应手,开发思路和 差不多,最大的特点就是可以避免异步嵌套。

2. Koa框架的安装使用

1. 安装 Node.js 7.6以上的版本;

使用Koa开发之前,Node.js 是有要求的,它要求 Node.js 版本高于 V7.6,因为 Node.js 7.6 版本 开始完全支持 async/await,所以才能完全支持我们的 Koa。

2. 安装 Koa;

npm --save koa 或者用淘宝镜像的 cnpm --save koa

3. Koa的基本使用;

// 引入Koa
var koa = require('koa');
// 实例化Koa
var app = new koa();// 配置路由
app.use( async(ctx)=>{ctx.body = "你好,koa"
});// 监听端口
app.listen(3000);

3. Koa异步处理Async 、Await和 的使用

async 是让方法变成异步。在终端里用 node 执行这段代码,你会发现输出了 {‘Hello async’ },它返回的是 。

async function testAsync(){return 'Hello async';
};
const result = testAsync();
console.log(result);// Promise { 'Hello async' }

await在等待async方法执行完毕。其实await等待的只是一个表达式,这个表达式在官方文档里说的是对象,但是它也可以接受普通值。 注意:await必须在async方法中才可以使用,因为await访问本身就会造成程序停止堵塞,所以必须在异步方法中才可以使用。

function getData() {return 'This is data';
};
async function testAsync() {return 'Hello async';
};
async function test() {// await 返回普通值const v1 = await getData();console.log(v1);// This is data// await 返回promise对象const v2 = await testAsync();console.log(v2);// Hello async
};
test();

综上所述,async 用于申明一个 是异步的,它会将其后的函数的返回值封装成一个 对象,而 await 用于等待一个异步方法即 执行完成,并将其 的结果返回出来。

4. Koa路由的使用

Koa中的路由和有所不同,在中直接引入就可以配置路由,但是在Koa中我们需要安装对应的koa-路由模块来实现。

// 1.安装 npm install --save koa-routervar Koa = require('koa');// 2.引入路由并实例化
var router = require('koa-router')();
var app = new Koa();// 3.配置路由
// 区别于Express,req和res的信息全部放到ctx里
router.get('/', async (ctx) => {// 返回数据// 相当于原生Node.js里的res.write()和res.end();ctx.body = "首页";});// 4.启动路由(来自于官方文档);
// router.allowedMethods()可以配置也可以不配置。
// 如果之前的没有设置响应头,配置此选项以后可以自动设置响应头。
app.use(router.routes()).use(router.allowedMethods());// 监听端口
app.listen(3000);

另外,Koa的路由执行顺序与有所不同,Koa 选择了洋葱圈模型,即最先访问的路由里的next()后面的代码最后响应。

以下一段代码会按编号依次输出,说明路由的执行顺序。

var Koa = require('koa');
var router = require('koa-router')();
var app = new Koa();app.use(async (ctx, next) => {console.log('1.这是一个中间件01');await next();console.log('5.匹配完路由以后又会返回来执行中间件')
});
app.use(async (ctx, next) => {console.log('2.这是一个中间件02');await next();console.log('4.匹配完路由以后又会返回来执行中间件')
});                   
router.get('/news', async (ctx) => {console.log('3.匹配到了news这个路由');ctx.body = '新闻页'
});app.use(router.routes());
app.use(router.allowedMethods());
app.listen(3000);

5. Koa中间件

中间件是配合路由匹配完成做的一系列的操作,我们就可以把它叫做中间件。Koa中运用中间件可以实现以下一些功能:

1. 添加应用。主要通过app.use()这个函数添加或是启动一些应用,如常见的一些第三方中间件的使用;

var Koa = require('koa');
var router = require('koa-router')();
var app = new Koa();// Koa 应用级中间件
app.use(async (ctx, next) => {// 匹配路由之前打印日期console.log(new Date());// 当前配路由匹配完成以后继续向下匹配// 如果不写next(),这个路由被匹配到了就会终止await next();
});router.get('/news', async (ctx) => {ctx.body = '新闻页面'
});
// 启动路由;
// router.allowedMethods()可以配置也可以不配置
// 如果之前的没有设置响应头,配置此选项以后可以自动设置响应头
app.use(router.routes());
app.use(router.allowedMethods());app.listen(3000);

2. 匹配路由;

主要通过next()这个函数完成多级路由匹配。

var Koa = require('koa');
var router = require('koa-router')();
var app = new Koa();// Koa 路由级中间件// 配置新闻页
router.get('/news', async(ctx,next) => {console.log('这是新闻路由');// 匹配到路由以后继续向下匹配await next();
});// 配置新闻页
router.get('/news', async (ctx) => {ctx.body = '这是新闻页'
});app.use(router.routes());
app.use(router.allowedMethods());app.listen(3000);

3. 错误处理;

如果当前访问的路由一直向下匹配没有匹配到,可以通过中间件给出错误响应。

var Koa = require('koa');
var router = require('koa-router')();
var app = new Koa();
// Koa 错误处理中间件
// 无论app.use放到路由前面还是后面
// 都是先执行app.use再去执行路由
app.use(async (ctx, next) => {console.log('这是一个中间件');       // 执行顺序1await next();if (ctx.status == 404) {           // 执行顺序3ctx.body = '这是一个404页面';} else {console.log(ctx.url);}
});
// 配置新闻页                            // 执行顺序2
router.get('/news', async (ctx, next) => {console.log('这是新闻路由');await next();
});app.use(router.routes());
app.use(router.allowedMethods());app.listen(3000);

6. Koa中get传值及获取get传值

Koa中的get传值主要有以下两种方式:

1. 键值对拼接传参,接收参数主要通过ctx.获取,需要注意的是在ctx与ctx.里均可以获得一样的结果;

var Koa = require('koa');
var router = require('koa-router')();
var app = new Koa();
// http://localhost:3000/news_details?id=123&author=aiguangyuan
router.get('/news_details',async(ctx)=>{// 从ctx中读取Get传值console.log(ctx.url);// /news_details?id=123&author=aiguangyuanconsole.log(ctx.query);// { id: '123', author: 'aiguangyuan' }// 获取的是对象,用的最多的方式console.log(ctx.querystring)// id=123&author=aiguangyuan// 获取的是字符串// 从ctx里的request里获取Get传值console.log(ctx.request.url);// /news_details?id=123&author=aiguangyuanconsole.log(ctx.request.query);// { id: '123', author: 'aiguangyuan' }console.log(ctx.request.querystring);// id=123&author=aiguangyuanctx.body='新闻详情页';});app.use(router.routes());
app.use(router.allowedMethods());
app.listen(3000);

2. 动态路由传参,接收参数主要通过ctx.获取;

var Koa = require('koa');
var router = require('koa-router')();
var app = new Koa();// http://localhost:3000/news_details/123/456
router.get('/news_details/:aid/:cid', async (ctx) => {// 获取动态路由的传值console.log(ctx.params);// { aid: '123' ,cid:'456'}ctx.body = '新闻详情页';});app.use(router.routes());
app.use(router.allowedMethods());
app.listen(3000);

7. Koa中post传值的获取

Koa中的post传值主要有以下两种方式:

1. 封装一个原生获取post传参的方法;

// 封装获取post传参的方法
exports.getPostData = function (ctx) {// 获取异步数据return new Promise(function (resolve, reject) {try {let str = '';ctx.req.on('data', function (chunk) {str += chunk;});ctx.req.on('end', function (chunk) {resolve(str);});} catch (err) {reject(err);}})
};

引入封装的方法获取数据。

var Koa = require('koa');
var router = require('koa-router')();
// 引入封装的方法
var common = require('./module/common.js')
var app = new Koa();// 接收post提交的数据
router.post('/doAdd', async (ctx) => {// 用封装的方法获取数据var data = await common.getPostData(ctx);console.log(data);// username=aiguangyuan&password=123456ctx.body = '添加成功';
});app.use(router.routes()).use(router.allowedMethods());
app.listen(3000);

2. 使用body-中间件获取post数据;


// 1.安装 npm install --save koa-bodyparser;var Koa = require('koa');
var router = require('koa-router')();
// 2.引入中间件
var bodyParser = require('koa-bodyparser'); var app = new Koa();
// 3.配置bodyparser的中间件
app.use(bodyParser());router.post('/doAdd', async (ctx) => {// 4.通过ctx.request.body获取表单提交的数据ctx.body=ctx.request.body;// {"username":"aiguangyuan","password ":"123456"}  
});
app.use(router.routes()).use(router.allowedMethods());
app.listen(3000);

8. Koa中 的使用

保存在浏览器客户端,可以让我们同一个浏览器访问同一个域名的时候共享数据,可以实现以下一些功能。

1. 保存用户信息;

2. 浏览器历史信息;

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了