Koa基础知识学习与提升

79 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第32天,点击查看活动详情

koa基础

安装

npm i koa -S

//响应时间输出中间件

app.use(async (cxt, next) => {

await next();

const rt = ct.response.get('X-Response-Time');

console.log(${cxt.method} ${cxt.url}-${rt});

})

//错误处理中间件

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

try{

await next();

}catch (error) {

//响应客户

ctx.status = error.statusCode || error.status || 500;

ctx.body = error.message;

//触发应用层级错误时间

ctx.app.emit('error', error, ctx);

console.log('捕捉到的错误', error.message);

}

})

触发错误

app.user(async (ctx, next) => {

ctx.throw(401, '认证失败')

})

全局错误事件

app.on("error", err => {

console.log('全局错误处理', err.message);

})

静态文件服务npm i -S koa-static

const static = require("koa-static");

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

 

模板引擎npm i koa-hbs@next -S

const hbs = require('koa-hbs')

app.use(hbs.middleware({

viewPath: __dirname + "/views", //视图根目录

defaultLayout: 'layout', //默认布局页面

partialsPath: _dirname + '/views/partials ', //注册partial目录

disableCache: true //开发阶段不缓存

}))

 

Koa鉴权session

Koa中使用session npm i koa-session -S

app.keys = ['secret', 'another secret'];

const SESS_CONFIG = {

key: 'zzb:sess',

maxAge: 86400,

httpOnly: true,

signed:true,

}

 

####session实现原理

服务器端在接受客户端首次访问时,在服务器端创建session,将session保存在redis中

给这个session生成一个唯一的标识字符串,在响应头中标识唯一字符串

浏览器中收到响应会解析响应由,将sid保存在本地cookie中,流量拿起在下次请求的请求头中会带上该域名下的cookie信息

 

使用redis存储session

安装 npm i -S Koa-redis

const redisStore = require('koa-redis');

const redis = require('redis');

const client = redis.createClient(6379, "localhost");

 

token验证

判断是否存在token,如果存在的话,则每个http header都加上token

config.headers.common["Authorization"] = "Beearer" + token;

 

Koa解决跨域问题

var koa = require('koa');

var cors = require('koa2-cors');

var app = new koa();

app.use(cors());

 

文件上传,表单校验

安装koa-multer npm i koa-multer -S

安装koa-bouncer npm i -S koa-bouncer

配置 app.js

//为koa上下文扩展一些校验的方法

app.use(bouncer.middleware());

图形验证码

安装trek-captcha npm i trek-captcha -S

发送短信

安装依赖 npm i -S moment md5 axios

生成6位随机数字验证码,发送请求,

短信发送成功,存储验证码到session中,也可以设置过期时间