koa的post请求,分页接口,token验证,登录注册,图片验证码

1,200 阅读2分钟

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;
});