安装脚手架

npm install -g koa-generator

创建项目

koa2 -e koa01

测试接口

routes下面创建一个test.js

const router = require('koa-router')()
//连接前缀
router.prefix('/test')
router.get("/",async (ctx, next)=>{
ctx.body={
id:10,
name: '李四',
age:20,
address:'湖南'
}
})
module.exports =router;

app.js引入

//引用
const users = require('./routes/test')

//使用
app.use(users.routes(), users.allowedMethods())

测试请求
http://localhost:3000/test

跨域

下载依赖

npm i kao2-cors

app.js配置

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

app.use(cors({
origin: '*',
allowedMethods:['GET','POST','OPTIONS','*'],
allowedHeaders:['Content-Type','token','authorization']
}))

连接数据库

在项目下创建db文件夹

下载依赖

npm i mysql

配置数据库信息

在db下面创建config.js

let dbOption
dbOption = {
connectionLimit: 10,
host: 'localhost',//IP
user: 'root',//用户名
password: 'root',//密码
port: '3306',//端口
database: 'blogserver'//数据库名字
}
module.exports = dbOption

封装数据库方法

在db下面创建index.js封装数据库方法

const mysql=require('mysql')
const dboptions= require('./config')
//创建连接池
const pool=mysql.createPool(dboptions);
//查询方法
function query(sql,params){
return new Promise((resolve,reject) => {
pool.getConnection((err,conn)=>{
if(err){
reject(err);
return;
}
//执行sql语句
conn.query(sql,params,(err,result)=>{
conn.release();
if(err){
reject(err);
return;
}
resolve(result);
})
})
})
}
module.exports=query

MD5加密

项目下创建utils文件夹

下载依赖

npm i crypto

保存常量

在utils下面创建constan.js

module.exports={
//秘钥
PWD_SALT: 'SERVEBLOG'
}

封装加密方法

在utils下面index.js封装加密方法

const crypto=require('crypto')
//密码加密
function md5(str){
//参数为String类型
return crypto.createHash('md5').update(String(str)).digest('hex')
}
module.exports={
md5
}

注册接口密码加密示例

/**
* 注册
*/
router.post('/register', async (req, res, next)=>{
//获取前台的数据
let {username, password,nickname,headimg} = req.body;
//为空就给默认的头像
headimg=headimg || 'https://gitee.com/xyhcodefilter/pic-go/raw/d514d8913c873b3c86329cb7d6f0cfbd18abab95/image/202204212057941.webp'
console.log(username,password,nickname,headimg);
//查询用户是否注册
try {
//根据用户名查询用户是否注册
let user=await querysql('select * from user where username = ?',[username]);
//没有注册
if(user.length === 0){
//加密
password=md5(`${password}${PWD_SALT}`);
//添加用户
let regresult=await querysql('insert into user (username,password,nickname,headimg) values (?,?,?,?)',[username,password,nickname,headimg]);
//查询添加后的用户信息
let userinfo=await querysql('select id,username,nickname,headimg from user where id=?',[regresult.insertId]);
//返回信息
res.send({
code: 201,
msg:'注册成功!',
data:userinfo[0]
})
}else{
res.send({
code:-1,
msg:'用户已注册!'
});
}
}catch (e) {
console.log(e);
//交给中间件
next(e);
}
});

token使用

下载依赖

npm i jsonwebtoken

添加常量

utils/constant.js 定义常量

module.exports={
//秘钥
PWD_SALT: 'SERVEBLOG',
//token秘钥
PRIVATE_KEY: 'xianxian',
//token过期时间 一天
EXPIRED:60*60*24
}

使用JWT 登入示例

routers/users.js 导入常量和JWT

const {PWD_SALT,PRIVATE_KEY,EXPIRED}=require('../utils/constant')
const jwt=require('jsonwebtoken')

/**
* 登入
*/
router.post('/login',async (req,res,next) => {
let {username, password} = req.body;
try{
//根据用户名查询用户是否注册
let user=await querysql('select * from user where username = ?',[username]);
//没有找到
if(user.length === 0){
res.send({
code:-1,
msg:'用户不存在!'
});
}else{
//加密
password=md5(`${password}${PWD_SALT}`);
//查询验证账号密码是否正确
let seres=await querysql('select * from user where username = ? and password = ?',[username,password]);
//没有找到
if(seres.length === 0){
res.send({
code:-1,
msg:'账号或密码不正确!'
})
}else{//存在
//取出用户的信息
let sinresult=seres[0];
//生成token({存的变量},常量token秘钥,{过期时间})
let token=jwt.sign({sinresult},PRIVATE_KEY,{expiresIn:EXPIRED});
//保存返回的数据
let returnres={
id: seres[0].id,
username: seres[0].username,
nickname: seres[0].nickname,
headimg: seres[0].headimg,
token:`Bearer ${token}`
}
//console.log(returnres);
res.send({
code:200,
msg:'登入成功!',
data:returnres
})
}
}
}catch (e) {
console.log(e);
//交给中间件
next(e);
}
})

拦截token

下载依赖

npm install koa-jwt 

拦截使用

app.js

//导入JWT
const {expressjwt: expressJWT} = require("express-jwt");
//constant.js常量
const {PRIVATE_KEY}=require('./utils/constant');

//拦截验证
app.use(expressJWT({
//自定义的秘钥 constant.js
secret:PRIVATE_KEY,
algorithms: ["HS256"],
}).unless({
path:[
'/api/users/register',//白名单 除了这里的地址 其他URL都要验证
'/api/users/login'
]
}))

token错误异常 app.js

app.use(function(err, req, res, next) {
// set locals, only providing error in development
//token出现异常
if (err.name === 'UnauthorizedError') {
// 这个需要根据⾃自⼰己的业务逻辑来处理理
res.status(401).send({code:401,msg:'token验证错误!'});
}else {
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
// render the error page
res.status(err.status || 500);
res.render('error');
}
});