post请求
npm install koa-body -S
const koaBody = require('koa-body');
app.use(koaBody())
//通过ctx.request.body获取post参数
注册 : post请求
// "/register" 请求的url
router.post("/register", async (ctx) => {
//传过来的 name, password, email
let { name, password, email } = ctx.request.body;
// 在数据库里面查找 与用户名name一样的数据 返回是一个数组
const findResult = await User.find({ name });
//判断有没有找到
if (findResult.length > 0) { //找到返回
ctx.body = { msg: "用户名已存在!" };
} else { //没有找到 注册用户
const newUser = new User({
name,
email,
password,
});
await newUser
.save()
.then((res) => {
ctx.body = newUser;
})
.catch((err) => {
console.log(err);
});
}
});
token请求
// 安装创建和解析token的第三方工具
npm install jsonwebtoken
middleware/userMiddleware
//引入jsonwebtoken
const jwt = require("jsonwebtoken");
const { secretKEY } = require("../config");
const auth = async (ctx, next) => {
const { authorization = "" } = ctx.request.header;
const token=authorization.replace("Bearer ","");
try {
const user=jwt.verify(token,secretKEY);
ctx.state.user=user
} catch (error) {
ctx.throw(401,"请登录")
}
await next()
};
//导出
module.exports={
auth
}
config.js
//secretKEY里面的值可以随便写
module.exports = {
connectionStr:'mongodb://127.0.0.1:27017/admin',
secretKEY:"oo"
}
图片验证码 安装svg-captcha
npm install --save svg-captcha
// app.js
const session = require('koa-session');
const {secretKEY}=require("./config")
app.keys = [secretKEY];
const config = {
key: 'koa:sess',
maxAge: 60000,
overwrite: true,
httpOnly: true,
signed: true,
rolling: true,//每次访问将会重置过期时间
renew: true
}
app.use(session(config, app));
// routsers/user.js
const svgCaptcha = require("svg-captcha");
// 验证码
router.get("/getCode", async (ctx) => {
const cap = svgCaptcha.create({
size: 4, //验证码个数
width: 160, //宽
height: 60, //高
fontSize: 50, //验证码字体大小
ignoreChars: "0oO1ilI", // 验证码字符中排除 0o1i
noise: 2, //干扰线条的数量
color: true, //验证码的字符是否有颜色,默认没有,如果设定了背景,则默认有
background: "#eee", // 验证码图片背景颜色
});
let img = cap.data;//验证码
// ctx.session.code 验证码文字忽略大小写
ctx.session.code = cap.text.toLowerCase();
ctx.response.type = "image/svg+xml"; //设置返回的数据格式
ctx.body = img;
});
登录接口
router.post("/login", async (ctx) => {
let { name, password, code } = ctx.request.body;
if (ctx.session.code) {
if (ctx.session.code !== code.toLowerCase()) {
ctx.status = 401;
ctx.body = { msg: "验证码不正确" };
return false;
}
// 在数据库里面查找 与用户名name 一样的数据
const findresult = await User.find({ name });
// 当查找到时
if (findresult.length > 0) {
// 判断用户名 密码是不是一样
if (
findresult[0].name === name &&
isRightPw(password, findresult[0].password)
) {
// 设置token需要的用户信息
let userInfo = { name: findresult[0].name, email: findresult[0].email };
// sign 第一个参数是查找到的用户信息,第二个是一个自己定义的字符串,第三个参数是时间
let token = jwt.sign(userInfo, secretKEY, { expiresIn: "1h" });
ctx.status = 200;
ctx.body = { msg: "登录成功", token: token };
} else {
ctx.status = 401;
ctx.body = { msg: "用户名或密码错误" };
}
} else {
ctx.status = 401;
ctx.body = { msg: "用户不存在" };
}
} else {
ctx.status = 401;
ctx.body = { msg: "验证码获取失败" };
}
});
分页接口
// /userList 请求列表的url auth 必须有token才能访问
router.get("/userList", auth, async (ctx) => {
// pageIndex : 第几页
// pageNumber : 多少条
let { pageIndex, pageNumber } = ctx.query;
pageIndex = Math.max(pageIndex * 1, 1) - 1;
pageNumber = Math.max(pageNumber * 1, 1);
const userList = await User.find()
.limit(pageNumber)
.skip(pageIndex * pageNumber);
//返回请求的状态和数据
ctx.status = 200;
ctx.body = userList;
});