koa2的简单用法

文档地址:https://koa.bootcss.com

全局安装:

cnpm i koa-generator -g

创建项目(默认):koa2 project 

使用es引擎创建项目:koa2 -e project

启动项目:
npm start,
npm run dev(可以自启动)

 

中间件:

  • 中间件执行顺序图:

 next(); :继续往下执行下一个中间件,next非常重要,一定要写,不然后面的中间件无法执行

这么执行的好处,比如执行的顺序是responseTime里面有个time变量,运行到logger里面的time被修改了,最后执行完又回到responseTime里面,这时候就可以检查time有没有被修改.
为什么要使用asyn:因为不管有没有使用async/await,app.use返回的始终都是Promise;使用asyn的话可以更方便的在内部掉调用下一个中间件的时候使用await next(),

如果不使用async的话会出现下面这种情况
awati阻塞的话会先执行外部的程序,等带await取消阻塞后,才会await下面的方法,如下:如果没有await的话,执行顺序是
1,3,4,2,有了await的话结果是:1,3,2,4

app.use((ctx,next) =>{
    console.log(1);
    next()
    console.log(2);
});

app.use(async (ctx,next) =>{
    console.log(3);
    const axios = require('axios');
    // await 会阻塞程序,导致先执行console.log(2),再执行console.log(4)
    const res = await axios.get('https://www.baidu.com/');
    console.log(4);
});

 想要保证洋葱模型的话就要使用async/await(必须在方法前面加上async,在next()前面加上await),下面的代码的执行顺序就变成了标准的洋葱模型,1,3,4,2

app.use(async (ctx,next) =>{
    console.log(1);
    await next()
    console.log(2);
});

app.use(async (ctx,next) =>{
    console.log(3);
    const axios = require('axios');
    const res = await axios.get('https://www.baidu.com/');
    console.log(4);
});

传值:可以通过ctx获取其他中间件的状态

app.use(async (ctx,next) =>{
    await next()

    // ctx.ending一定要在next()后面获取,否则娶不到哦
    console.log(ctx.ending); // 执行完毕
});

app.use(async (ctx,next) =>{
    await next()
});

app.use(async (ctx,next) =>{
    await next();
    ctx.ending = '执行完毕';
});


router:(可以去github上搜koa-router看下方法就行.)

const router = require('koa-router')()

// render:渲染页面的
router.get('/', async (ctx, next) => {
  await ctx.render('index', {
    title: 'Hello Kodddda 2dd!'
  })
})
// ctx.body:用来写接口的
router.get('/string', async (ctx, next) => {
  ctx.body = 'koa2 string'
})

module.exports = router; // 不要忘了导出哦,导出后在app.js里面 app.use(XX)
router.prefix('/users'); // 路由模块化;

// 访问这个页面 http://localhost:3000/users/bar
router.get('/bar', function (ctx, next) {
  ctx.body = 'this is a users/bar response'
})

cookies和session
cookies用法: ctx.cookies.set('name', 'tobi', { signed: true });
session:服务端用session来保存用户状态和标识。
session和cookie的关系是,服务端把session设置到cookie里并传给客户端,客户端下次访问服务器其他接口时,又会通过cookie把这个session信息传给服务端,服务端通过session判断用户是否满足需求。

redis:

安装:(www.runoob.com/redis/redis-install.html)

启动:redis-server

项目中安装中间件:
npm i koa-generic-session koa-redis
koa-generic-session:处理session
koa-redis:链接redis的
session存储到redis中

app.js中:

const session = require('koa-generic-session');
const Redis = require('koa-redis');
// 连接
app.keys = ['keys','keyskeys']; // 做加密处理 
app.use(session({
    key:'mt', // 将koa关键字换成mt
    prefix:'mtpr',
    store:new Redis()
}))

设置session变量;
再根目录新建middle/m.js,加入以下代码

//m.js添加如下代码
function m(ctx){
     ctx.session.count++;
    global.console.log('mm',ctx.path)
}
module.exports = function (){
    return async function(ctx,next){
        m(ctx)
        await next();
    }
}

// app.js添加以下代码
const m = require('./middle/m');
app.use(m())

然后刷新页面,在Application下面的cookies里面就可以看到新加入的.sig信息

再redis服务中查看存储的是什么,读取出来;
启动:redis-cli;
输入 命令 keys* ,就可以看到所有的key下面的value

读取可以下面的count值;输入命令:get mtprAF79ui_pGNBiH6ETmyymGmSaLITz8Cq4

 

直接操作redis(不需要session)

在建一个接口;

在routes/users.js里面加以下代码

const Redis = require('koa-redis');
const Store = new Redis().client

router.get('/fix', async function (ctx) {
    const st = await Store.hset('fix','name','asdfghjkl');
    ctx.body = {
        code: 0
    }
})

项目下控制面板输入 curl http://localhost:3000/users/fix 回车,出现code:0,就是成功的意思

然后回到之前的命令行面板输入keys *,就可以看到fix出现在下面了;

输入hget fix name,就可以看到具体的值了

更多命令可以去文档下查看(http://www.runoob.com/redis/redis-commands.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值