Koa & Mongoose & Vue实现先后端分离--05服务端注册&登陆:业务逻辑

上节回顾

  • @koa/router的用法
  • 用户路由的定义
  • koa中间件的使用
  • Postman基本测试

工做内容

  • 后端:参数的获取
  • 后端:数据库的写入与查询
  • Postman:接口测试

准备工做

  • npm i -S koa-body //对Post、Put、Patch请求参数处理

业务逻辑

参数获取

支持荷载存储到ctx.request.body

// 更新文件:/server/app.js
const koa = require('koa');
const bodyParser = require('koa-body'); // 新增
const routes = require('./router');

const app = new koa();

app.use(bodyParser());// 新增:在处理请求数据的中间件前调用
//app.use((ctx, next) => {
//  ctx.body = '测试测试测试';
//  next();
//}) //无用代码删除
app.use(...router.routes).use(...router.allowedMethods);
routes.forEach(route => {
  app.use(route);
});

app.on('error', err => {
  log.error('server error', err)
});
module.exports = app;

更新注册&登陆路由

  • 调用POST方法分别访问/users?action='register'/users?action='login'
  • 经过ctx.query能够获取Url上的参数。
// 更新文件:/server/router/users.js部分代码
...
  {
    path: '/',
    method: 'POST',
    handle: async (ctx) => {
      const { action } = ctx.query;
      switch (action) {
        case 'register':
          await register(ctx);
          break;
        case 'login':
          await login(ctx);
          break;
        default:
          await list(ctx);
      }
    }
  },
...
  • 测试结果

register结果

  • 能够经过断点查看数据

断点数据

注册逻辑

更新注册逻辑

// 更新文件:/server/control/user.js
const userModel = require('../model/user');
...
async function register (ctx) {
  const { account, password } = ctx.request.body;//获取荷载
  if (!account || !password) {
    ctx.body = { // 返回json
      code: '403',
      data: null,
      msg: '账号/密码不能为空'
    }
    return;
  }
  try {
    const user = await userModel.findOne({ // 查看数据库是否已有数据
      account
    });
    if (user) {
      ctx.body = {
        code: '403',
        data: null,
        msg: '用户已经存在'
      }
    } else {
      const newUser = await new userModel({ // 新建数据
        account,
        password
      }).save();
      ctx.body = {
        code: '200',
        data: newUser,
        msg: '注册成功'
      }
    }
  } catch (err) {
    ctx.body = {
      code: '403',
      data: null,
      msg: err.message
    }
  }
}
...
  • 经过ctx.request.body获取调用POST方法传过来的参数
  • 经过userModel.findOne(<condition>)查找匹配条件的数据
  • 经过new userModel(<Data>).save()存储数据

测试逻辑

  • Body面板 --> raw --> JSON格式 --> 输入参数 --> 查看结果

register结果

  • 存储结果直接返回,会将password返回,这里自行过滤掉敏感信息。

数据库结果

robot

登陆逻辑

更新注册逻辑

async function login (ctx) {
  const { account, password } = ctx.request.body;
  if(!account || !password) {
    ctx.body = {
      code: '404',
      data: null,
      msg: '参数不合法'
    };
    return;
  }
  const user = await userModel.findOne({
    account,
    password
  });
  if(user) {
    ctx.body = {
      code: '200',
      data: user,
      msg: '登录成功'
    }
  } else {
    ctx.body = {
      code: '404',
      data: null,
      msg: '账号/密码错误'
    }
  }
}

测试逻辑

  • Body面板 --> raw --> JSON格式 --> 输入参数 --> 查看结果

login测试

常见问题

  • 查看服务端是否启动
  • 查看请求方式Method是否正确
  • 多用断点调试问题

课后尝试

  • /server/app.jsapp.use(bodyParser())注释掉,看看是否还能ctx.request.body是否存在
  • 用断点多看一下ctx的结构

参考文档

koa-body
mongoosejs#Model Apihtml

相关文章
相关标签/搜索