安装脚手架
npm install -g koa-generator
|
创建项目
测试接口
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

跨域
下载依赖
app.js配置
const cors=require('koa2-cors');
app.use(cors({ origin: '*', allowedMethods:['GET','POST','OPTIONS','*'], allowedHeaders:['Content-Type','token','authorization'] }))
|
连接数据库
在项目下创建db文件夹
下载依赖
配置数据库信息
在db下面创建config.js
let dbOption dbOption = { connectionLimit: 10, host: 'localhost', 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; } conn.query(sql,params,(err,result)=>{ conn.release(); if(err){ reject(err); return; } resolve(result); }) }) }) } module.exports=query
|
MD5加密
项目下创建utils文件夹
下载依赖
保存常量
在utils下面创建constan.js
module.exports={ PWD_SALT: 'SERVEBLOG' }
|
封装加密方法
在utils下面index.js封装加密方法
const crypto=require('crypto')
function md5(str){ 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使用
下载依赖
添加常量
utils/constant.js 定义常量
module.exports={ PWD_SALT: 'SERVEBLOG', PRIVATE_KEY: 'xianxian', 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]; 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}` } res.send({ code:200, msg:'登入成功!', data:returnres }) } } }catch (e) { console.log(e); next(e); } })
|
拦截token
下载依赖
拦截使用
app.js
const {expressjwt: expressJWT} = require("express-jwt");
const {PRIVATE_KEY}=require('./utils/constant');
app.use(expressJWT({ secret:PRIVATE_KEY, algorithms: ["HS256"], }).unless({ path:[ '/api/users/register', '/api/users/login' ] }))
|
token错误异常 app.js
app.use(function(err, req, res, next) { 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 : {}; res.status(err.status || 500); res.render('error'); } });
|