KOA

一、Koa 框架介绍

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

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

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

1、HelloWord

安装 Koa
npm install --save koa / cnpm install --save koa
var koa =require('koa');
var app=new koa();

//配置路由

//中间件

//express写法
//app.use(function(req,res){
//
//    res.send('返回数据')
//})


app.use( async (ctx)=>{
     ctx.body='你好 koa2.x';
})

app.listen(3000);

2、HelloWord

路由(Routing)是由一个 URI(或者叫路径)和一个特定的 HTTP 方法(GET、POST 等) 组成的,涉及到应用如何响应客户端对某个网站节点的访问。

3、Koa 路由

npm install --save koa-router
/**
 https://www.npmjs.com/package/koa-router

 1.安装模块

 2.看文档使用

 */

//引入 koa模块

var Koa=require('koa');

var router = require('koa-router')();  /*引入是实例化路由** 推荐*/

//实例化
var app=new Koa();

router.get('/',async (ctx)=>{
    ctx.body="首页";

})

router.get('/news',async (ctx)=>{
    ctx.body="新闻列表页面";

})
//动态路由  http://localhost:3002/newscontent/xxxx
router.get('/newscontent/:aid',async (ctx)=>{

    //获取动态路由的传值

    console.log(ctx.params);  //{ aid: '456' }

    ctx.body="新闻详情";

})
//动态路由里面可以传入多个值

//http://localhost:3002/package/123/456

router.get('/package/: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);


4、koa 中间件

一、什么是 Koa 的中间件

通俗的讲: 中间件就是匹配路由之前或者匹配路由完成做的一系列的操作,我们就可以 把它叫做中间件。

二、Koa 应用可使用如下几种中间件:
  • 应用级中间件
  • 路由级中间件
  • 错误处理中间件
  • 第三方中间件
  1. 应用级中间件

//引入 koa模块

var Koa=require('koa');
var router = require('koa-router')();  /*引入是实例化路由** 推荐*/
var app=new Koa();

//Koa中间件

//匹配任何路由  ,如果不写next,这个路由被匹配到了就不会继续向下匹配
/*
 app.use(async (ctx)=>{
    ctx.body='这是一个中间件';
 })
* */

/*匹配路由之前打印日期*/
app.use(async (ctx,next)=>{

    console.log(new Date());

    await next(); /*当前路由匹配完成以后继续向下匹配*/
})

router.get('/',async (ctx)=>{

    ctx.body="首页";

})
router.get('/news',async (ctx)=>{
    ctx.body="新闻列表页面";

})
router.get('/login',async (ctx)=>{
    ctx.body="新闻列表页面";
})


app.use(router.routes());   /*启动路由*/
app.use(router.allowedMethods());
app.listen(3002);
  1. 路由中间件

//引入 koa模块

var Koa=require('koa');
var router = require('koa-router')();  /*引入是实例化路由** 推荐*/
var app=new Koa();

//Koa中间件

//匹配任何路由  ,如果不写next,这个路由被匹配到了就不会继续向下匹配


router.get('/',async (ctx)=>{

    ctx.body="首页";

})
// 匹配到news路由以后继续向下匹配路由
router.get('/news',async (ctx,next)=>{
    console.log('这是一个新闻1');

    await next();
})
router.get('/news',async (ctx)=>{

    ctx.body='这是一个新闻';
})

router.get('/login',async (ctx)=>{
    ctx.body="新闻列表页面";
})


app.use(router.routes());   /*启动路由*/
app.use(router.allowedMethods());
app.listen(3002);

  1. 错误处理中间件

//引入 koa模块

var Koa=require('koa');
var router = require('koa-router')();  /*引入是实例化路由** 推荐*/
var app=new Koa();

//Koa中间件

//匹配任何路由  ,如果不写next,这个路由被匹配到了就不会继续向下匹配

//www.域名.com/news
app.use(async (ctx,next)=>{
    console.log('这是一个中间件01');
    next();

    if(ctx.status==404){   /*如果页面找不到*/
        ctx.status = 404;
        ctx.body="这是一个 404 页面"
    }else{
        console.log(ctx.url);
    }
})

router.get('/',async (ctx)=>{

    ctx.body="首页";

})
router.get('/news',async (ctx)=>{
    console.log('这是新闻2');
    ctx.body='这是一个新闻';
})
router.get('/login',async (ctx)=>{
    ctx.body="新闻列表页面";
})

app.use(router.routes());   /*启动路由*/
app.use(router.allowedMethods());
app.listen(3002);


  1. koa中间件的执行流程

//引入 koa模块

var Koa=require('koa');
var router = require('koa-router')();  /*引入是实例化路由** 推荐*/
var app=new Koa();

//Koa中间件

//匹配任何路由  ,如果不写next,这个路由被匹配到了就不会继续向下匹配

//www.域名.com/news
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('/',async (ctx)=>{

    ctx.body="首页";

})
router.get('/news',async (ctx)=>{

    console.log('3、匹配到了news这个路由');
    ctx.body='这是一个新闻';
})


app.use(router.routes());   /*启动路由*/
app.use(router.allowedMethods());
app.listen(3002);

6、koa ejs 模板引擎

1、安装 koa-views 和 ejs
npm install --save koa-views    npm install ejs --save

//引入 koa模块

/*
ejs模板引擎的使用:

    1.npm install koa-views  --save

    2.npm install ejs  --save


    3.var views = require('koa-views');

    app.use(views(__dirname, { extension: 'ejs' }))   //模板的后缀名是ejs


    4 await ctx.render('index');


* */
注意:我们需要在每一个路由的render里面都要渲染一个公共的数据

    公共的数据放在这个里面,这样的话在模板的任何地方都可以使用


     ctx.state = {   //放在中间件
         session: this.session,
         title: 'app'
     };



var Koa=require('koa'),
    router = require('koa-router')(),
    views = require('koa-views');

var app=new Koa();



//配置模板引擎中间件  --第三方中间件
//app.use(views('views', { map: {html: 'ejs' }}));   //这样配置也可以  注意如果这样配置的话 模板的后缀名是.html
app.use(views('views',{
    extension:'ejs'  /*应用ejs模板引擎*/
}))

//写一个中间件配置公共的信息
app.use(async (ctx,next)=>{

    ctx.state.userinfo='张三';

    await next();/*继续向下匹配路由*/
})

router.get('/',async (ctx)=>{

   let title="你好ejs";

   await ctx.render('index',{

        title:title
    });

})
router.get('/news',async (ctx)=>{
    //ctx.body='这是一个新闻';

    let list=['11111','22222','33333'];

    let content="<h2>这是一个h2</h2>";

    let num=12;
    await ctx.render('news',{
        list:list,
        content:content,
        num:num
    })

})

app.use(router.routes());   /*启动路由*/
app.use(router.allowedMethods());
app.listen(3000);

7、Koa 中 koa-bodyparser 中间件的使用

1、安装 koa-bodyparser
npm install --save koa-bodyparser
/*
 Koa 中 koa-bodyparser 中间件获取表单提交的数据

    1.npm install --save koa-bodyparser

    2.引入var bodyParser = require('koa-bodyparser');

    3.app.use(bodyParser());

    4.ctx.request.body;  获取表单提交的数据
* */
var Koa=require('koa'),
    router = require('koa-router')(),
    views = require('koa-views'),
    bodyParser = require('koa-bodyparser');

var app=new Koa();
/*应用ejs模板引擎*/
app.use(views('views',{
    extension:'ejs'
}))

//配置post bodyparser的中间件
app.use(bodyParser());

router.get('/',async (ctx)=>{

    await  ctx.render('index');
})

//接收post提交的数据
router.post('/doAdd',async (ctx)=>{

    console.log(ctx.request.body);
    ctx.body=ctx.request.body;  //获取表单提交的数据
})

app.use(router.routes());   /*启动路由*/
app.use(router.allowedMethods());
app.listen(3000);

8、koa koa-static 静态资源中间件

1、安装 koa-static
npm install --save koa-static
const static = require('koa-static');

app.use(static(__dirname+'/static'));

app.use(static(__dirname+'/public'));   //koa静态资源中间件可以配置多个

9、koa art-template 模板引擎

一、常见模板引擎的性能对比
  • 适用于 koa 的模板引擎选择非常多,比如 jade、ejs、nunjucks、art-template 等。
  • art-template 是一个简约、超快的模板引擎。
  • 它采用作用域预声明的技术来优化模板渲染速度,从而获得接近 JavaScript 极限 的运行 性能,并且同时支持 NodeJS 和浏览器。
  • art-template 支持 ejs 的语法,也可以用自己的类似 angular 数据绑定的语法
    官网
    中文文档
    安装
npm install --save art-template
npm install --save koa-art-template

/*
 http://aui.github.io/art-template/koa/

 1、

 npm install --save art-template
 npm install --save koa-art-template


 2、const render = require('koa-art-template');


 3、

 render(app, {
     root: path.join(__dirname, 'view'),   视图的位置
     extname: '.art', 后缀名
     debug: process.env.NODE_ENV !== 'production'  是否开启调试模式

 });
4、
 await ctx.render('user');
* */
var Koa=require('koa'),
    router = require('koa-router')(),
    render = require('koa-art-template'),
    path=require('path');

var app=new Koa();

//配置 koa-art-template模板引擎
render(app, {
    root: path.join(__dirname, 'views'),   // 视图的位置
    extname: '.html',  // 后缀名
    debug: process.env.NODE_ENV !== 'production'  //是否开启调试模式

});

router.get('/',async (ctx)=>{
   //ctx.body="首页"
    let list={

        name:'张三',
        h:'<h2>这是一个h2</h2>',
        num:20,
        data:['11111111','2222222222','33333333333']
    }

    await ctx.render('index',{
        list:list

    });
})
//接收post提交的数据
router.get('/news',async (ctx)=>{

    let app={

        name:'张三11',
        h:'<h2>这是一个h211</h2>',
        num:20,
        data:['11111111','2222222222','33333333333']
    };
    await ctx.render('news',{
        list:app
    });
})


app.use(router.routes());   /*启动路由*/
app.use(router.allowedMethods());
app.listen(3000);

10、koa Cookie的使用

  • cookie 是存储于访问者的计算机中的变量。可以让我们用同一个浏览器访问同一个域 名的时候共享数据。
  • HTTP 是无状态协议。简单地说,当你浏览了一个页面,然后转到同一个网站的另一个页 面,服务器无法认识到这是同一个浏览器在访问同一个网站。每一次的访问,都是没有任何 关系的。
1、Koa 中设置/获取 Cookie 的值
ctx.cookies.set(name, value, [options])
ctx.cookies.get('name');

通过 options 设置 cookie name 的 value :### 12、HelloWord
在这里插入图片描述

2、Koa 中设置中文 Cookie
// 转换成 base64 字符 串:aGVsbG8sIHdvcmxkIQ== 
console.log(new Buffer('hello, world!').toString('base64'));

// 还原 base 64 字符串:hello, world!
console.log(new Buffer('aGVsbG8sIHdvcmxkIQ==', 'base64').toString());

11、Koa Session 的使用

一、Session 简单介绍

session 是另一种记录客户状态的机制,不同的是 Cookie 保存在客户端浏览器中,而 session 保存在服务器上。

二、Session 的工作流程

当浏览器访问服务器并发送第一次请求时,服务器端会创建一个 session 对象,生 成一个类似于 key,value 的键值对, 然后将 key(cookie)返回到浏览器(客户)端,浏览 器下次再访问时,携带 key(cookie),找到对应的 session(value)。 客户的信息都保存 在 session 中

三、koa-session 的使用:
  1. 安装 express-session
npm install koa-session --save
  1. 设置官方文档提供的中间件
//配置session的中间件
app.keys = ['some secret hurr'];   /*cookie的签名*/
const CONFIG = {
    key: 'koa:sess', /** 默认 cookie key (default is koa:sess)*/
    maxAge: 10000,  /*  cookie的过期时间        【需要修改】  */
    overwrite: true, /** (boolean) can overwrite or not (default true)    没有效果,默认 */
    httpOnly: true, /**  true表示只有服务器端可以获取cookie */
    signed: true, /** 默认 签名 */
    rolling: true, /** 在每次请求时强行设置 cookie,这将重置 cookie 过期时间(默认:false) 【需要修改】 */
    renew: false, /** (boolean) renew session when session is nearly expired      【需要修改】*/
};
app.use(session(CONFIG, app));
  1. 使用
设置值 ctx.session.username = "张三"; 
获取值 ctx.session.username

12、 es6中的单例案例

class Db {

    static getInstance(){   /*单例*/

        if(!Db.instance){

            Db.instance=new Db();
        }
        return Db.instance;
    }

    constructor(){

        console.log('实例化会触发构造函数');

        this.connect();
    }

    connect(){

        console.log('连接数据库');
    }
    find(){
        console.log('查询数据库');
    }
}

13、 用单例封装链接数据库实例

//DB库
const MongoClient = require("mongodb").MongoClient;

const Config = require("./config.js");

class Db {
  constructor() {
    this.dbClient = "";
    this.connect();
  }
  //实现单例
  static getInstance(){
    if(!Db.instance){
      Db.instance=new Db()
    }
    return Db.instance

  }

  //连接数据库
  connect() {
    let _that = this;
    return new Promise((resolve, reject) => {
      if (!_that.dbClient) {
        MongoClient.connect(Config.dbUrl, (err, client) => {
          if (err) {
            reject(err);
          } else {
            console.log("no");
            _that.dbClient = client.db(Config.dbName);
            resolve(_that.dbClient);
          }
        });
      } else {
        console.log("already");
        resolve(_that.dbClient);
      }
    });
  }
  find(collectionName, json) {
    return new Promise((resolve, reject) => {
      this.connect().then((db) => {
        var result = db.collection(collectionName).find(json);
        result.toArray((err, docs) => {
          if (err) {
            reject(err);
            return;
          }
          resolve(docs);
        });
      });
    });
  }
  update() {}
  insert() {}
}
module.exports = Db.getInstance()

14、koa 应用生成器

(1)全局安装
npm install koa-generator -g
(2)创建项目
koa koa_demo 
(3)安装依赖
cd koa_demo npm install 
(4)启动项目
npm start
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值