目录:

  1. 概述

  2. hello world

  3. 中间件

  4. 路由中间件koa-router

  5. body解析中间件koa-bodyparser

  6. 授之以渔

一、概述

  koa 是由 Express 原班人马打造的,致力于成为一个更小、更富有表现力、更健壮的 Web 框架。使用 koa 编写 web 应用,通过组合不同的 generator,可以免除重复繁琐的回调函数嵌套,并极大地提升错误处理的效率。koa 不在内核方法中绑定任何中间件,它仅仅提供了一个轻量优雅的函数库,使得编写 Web 应用变得得心应手。  

二、hello world

  在编程界学习任何语言跟框架都是从hello world开始,我们学习koa也不例外。

  现在我们先安装koa

需要的环境
nodejs 7.6.0或者以上 环境部署:
进入终端,依次输入命令
$ mkdir koa
$ cd koa
$ vi package.json
把下面文本复制到package.json文件,并保存退出vi {
"name": "koatest",
"description": "koa test",
"version": "1.0.0",
"scripts": {
"start": "node app.js"
},
"dependencies": {
"koa": "^2.2.0"
}
}
$ npm install

  至此我们已经完成koa的安装,下面开始编写代码,在koa目录下创建app.js文件

// app.js

const Koa = require('koa');
const app = new Koa(); app.use((ctx,next) => {
ctx.body = 'Hello World';
}); app.listen(3001);

  一个简单的基于koa框架的http服务器就搭建成功了,我们启动服务器

$ npm start

  服务器启动后,在浏览器打开:http://localhost:3001

  如果你能看到 Hello World 那么恭喜你,你已经成功了一半。

三、中间件

  分析hello world代码:

  1.首先创建app,是一个Koa的实例

const app = new Koa();  

  2.为app添加一个中间件,中间件至少一个。其中中间有两个入参,ctx-请求响应的上下文,next-下个中间的的触发器

app.use((ctx,next) => {
ctx.body = 'Hello World';
});

  3.监听客户端连接,端口3001

app.listen(3001);

  这样只要有客户端连接进来,就交由中间件来处理相应的请求。到此一个简单服务器就已经完成了。

  对于koa框架来说,通过以上三个步骤就能完成了一个服务器的搭建。是不是觉得很简单?有了nodejs后端编程是不是变得有趣简单多了?

  多个中间件:

  有些时候我们在处理一个请求,可能要对请求、响应做出多个处理后才能得到真正的结果返回给客户端。

  这里说的'多个处理',我们当然把它们放在一个中间件里面实现,但是这样会有多个弊端:

  1.一处的代码臃肿

  2.扩展性不高

  3.等等

  我们可以通过多个中间件模式来解决这个问题:把多个处理分散到多个中间件来分别处理。

  先来看看两个中间件的情况:

const Koa = require('koa');
const app = new Koa();
// 中间件1
app.use((ctx, next)=>{
ctx.body = 'hello ';
next();
});
// 中间件2
app.use((ctx, next)=>{
// 注意这里的 += 操作符
ctx.body += 'world';
next();
});
app.listen(3001);

  这时候得到的结果刚好也是:hello world

  中间件的函数的其中一个参数next,它是一个函数。当调用next()时意思是执行下一个中间,否则整个请求流程到此结束。我们可以把中间件1的里面的next()去掉并运行看看结果是什么。对,没错,结果是 hello 。当然也可以吧next();函数的位置移动到

  异步中间件函数:

  从前面代码可以知道中间件就是一个函数(同步),有时候我们需要在中间处理一个异步请求操作,比如读取数据库,所以Koa给我们提供了异步的中间件  

app.use(async (ctx, next)=>{
 // 处理异步操作,并等待它完成
await SetTimeout(3000);
// ctx.body += 'hello ';
 // 直到异步操作完成后,才触发下一个中间件 
next();
});

  async await为ES7的一个异步标准,不懂在自己补。

  npmjs上面有很多针对koa框架的中间件,可以满足我们一般需求。一般情况下我们的app是由多个中间件一起协同完成,下面我们会介绍几个常用的中间件。

四、路由中间件Koa-router

  好了,我们有了一个很好的框架,接下来我们将要添加一些简单的业务:登录、退出登录

  http://localhost:3001/login

  http://localhost:3001/logout

  如果你在浏览器打开上面两个URL,你得到的结果都会是:hello world。

  这可怎么办与需求不一样啊,我们需要的是打开login时提示登录成功,打开logout是提示退出登录成功。

  这时就该我们的路由中间件上场啦。

  先安装路由中间件,我选的是koa-router,npmjs地址:https://www.npmjs.com/package/koa-router

$ npm install koa-router  --save    

  把app.js改一下:

// app.js

const Koa = require('koa');
const app = new Koa();
const router = require('./routers') // routes
app.use(router.routes()); app.listen(3001);

   创建routers/index.js文件,代码如下:

const Router = require('koa-router');
let router = new Router(); router.get('/', function (ctx, next) {
ctx.body = 'hello world';
});
router.get('/login', function (ctx, next) {
ctx.body = 'login succeed';
});
router.get('/logout', function (ctx, next) {
ctx.body = 'logout succeed';
}); module.exports = router;

  重启服务器,我们这时候再打开login、logout,结果将如你预期所想:

  http://localhost:3001/login    ==> login  succeed

  http://localhost:3001/logout       ==>  logout succeed

五、body解析中间件koa-bodyparser

  当客户端通过Get请求时,Get的参数通过ctx.query[key]获取

  当客户端通过Post请求时Post的请求数据是存在body的,但是Koa并没有api可以直接获取,我们只能自己解析。

  koa-bodyparser中间件就是做这些事的,先安装

npm install --save koa-bodyparser

  使用

const app = new Koa();
// 黑名单
app.use(async (ctx, next) => {
if (ctx.path === '/logout'){
// 不用去解析body了,我不需要
ctx.disableBodyParser = true;
}
await next();
});
app.use(new bodyParser()); app.use(async (ctx, next)=>{
console.log(ctx.request.body);
ctx.body = 'hello world';
});

  1.经过bodyparser解析后的body是存在ctx.request.body,可以通过ctx.request.body[key]获取相应的参数

  2.有些路由是明确不需要body的,这样我们可以在 app.use(new bodyParser())之前再加一个中间件,在不需要解析的path下

  设置ctx.disableBodyParser = true;

  

六、授之以渔

  授之于鱼不若授之以渔

  大家在做项目的过程中,如果寻找合适的Koa中间件的,下面有两个方法

  1.百度

  2.在nmpjs里面搜索

  第一个我们就不说了,我们来说说第二个方法

  假设我们需要一个session管理的中间件

  1.打开https://www.npmjs.com/

  2.在搜索框输入:koa session

  

   3.发现第一个结果koa-session好像好不错并且更新到了5.0版本,应该挺成熟的了,我们点进去

  

  4.点进来后是中间件的详情页,有安装方法和简单实用方法。如果在这个页面得不到你想要的东西,可以进入中间件的github网站查询更多信息。

  

  

 

koajs框架学习的更多相关文章

  1. IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习保护API

    IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习之保护API. 使用IdentityServer4 来实现使用客户端凭据保护ASP.N ...

  2. Hadoop学习笔记—18.Sqoop框架学习

    一.Sqoop基础:连接关系型数据库与Hadoop的桥梁 1.1 Sqoop的基本概念 Hadoop正成为企业用于大数据分析的最热门选择,但想将你的数据移植过去并不容易.Apache Sqoop正在加 ...

  3. Spring框架学习一

    Spring框架学习,转自http://blog.csdn.net/lishuangzhe7047/article/details/20740209 Spring框架学习(一) 1.什么是Spring ...

  4. EF框架学习手记

    转载: [ASP.NET MVC]: - EF框架学习手记 1.EF(Entity Framework)实体框架EF是ADO.NET中的一组支持开发面向数据的软件应用程序的技术,是微软的一个ORM框架 ...

  5. web框架学习列表

    转载自鲁塔弗的博客,原文网址:http://lutaf.com/148.htm web framework层出不穷,特别是ruby/python,各有10+个,php/java也是一大堆 根据我自己的 ...

  6. 2013 最新的 play web framework 版本 1.2.3 框架学习文档整理

    Play framework框架学习文档 Play framework框架学习文档 1 一.什么是Playframework 3 二.playframework框架的优点 4 三.Play Frame ...

  7. SSH 框架学习之初识Java中的Action、Dao、Service、Model-收藏

    SSH 框架学习之初识Java中的Action.Dao.Service.Model-----------------------------学到就要查,自己动手动脑!!!   基础知识目前不够,有感性 ...

  8. 各种demo——CI框架学习

    各种demo——CI框架学习   寒假学习一下CI框架,请各位多多指教! 一.CI的HelloWorld! 注意:CI禁止直接通过文件目录来访问控制器. ./application/controlle ...

  9. phalcon(费尔康)框架学习笔记

    phalcon(费尔康)框架学习笔记 http://www.qixing318.com/article/phalcon-framework-to-study-notes.html 目录结构   pha ...

随机推荐

  1. ABAP术语-Field

    Field 原文:http://www.cnblogs.com/qiangsheng/archive/2008/02/01/1061244.html Name in an ABAP program f ...

  2. Flask-SQLAlchemy安装及设置

    Flask-SQLAlchemy安装及设置 SQLALchemy 实际上是对数据库的抽象,让开发者不用直接和 SQL 语句打交道,而是通过 Python 对象来操作数据库,在舍弃一些性能开销的同时,换 ...

  3. Ruby字符串的一些方法

    最近因为公司需求开始看ruby,先从ruby的基本数据类型开始看 看到ruby的字符串类型string,发现ruby中的字符串单双引号是不一样的,这点和Python有那么点不一样 主要是我们对字符串进 ...

  4. dotnet core 项目

    项目 常用命令 我们使用dotnet core 命令行来创建项目及进行编译,发布等,比较常用的dotnet core 命令 如下: dotnet new [arguments] [options] 创 ...

  5. Rmarkdown:输出pdf设置

    输出pdf需要安装Ctex --- title: "first markdown" author: "name" date: "`r format(S ...

  6. linux io 学习笔记(03)---共享内存,信号灯,消息队列

    system V IPC 1)消息队列 2)共享内存 3)信号灯(信号量集) 1.消息队列. ipcs -q 查看系统中使用消息队列的情况 ipcrm -q +msqid 删除消息队列 消息队列工作原 ...

  7. MySQL 从入门到删库

    基本操作 登陆指令 mysql -u用户名 -p密码(可以非明文输入) -h主机/IP -D端口 --prompt 提示符 修改提示符 \D 日期 \d 当前数据库 \h 服务器名 \u 用户名 // ...

  8. 20145202马超 实验二《Java面向对象程序设计》实验报告

    实验二 Java面向对象程序设计 实验内容 1.初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装.继承.多态 3.初步掌握UML建模 4.熟悉S.O.L.I.D原则 5.了解设计模式 实验 ...

  9. dfs Gym - 100989L

    AbdelKader enjoys math. He feels very frustrated whenever he sees an incorrect equation and so he tr ...

  10. Messy Code in Windows Server 2008 R2 English Edition

          We always use Windows Server 2008 R2 English operation system. And it doesn't have any problem ...