全局安装:
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)