手把手带你入门Koa+sequelized完成注册登录+TodoList功能 day2

300 阅读2分钟
  1. 解析body

  1. 安装 koa-body

npm i ``koa``-body

  1. 改写中间件

改写app/index.js

const Koa = require('koa')
const koaBody = require('koa-body')
const app = new Koa()

const userRouter = require('../router/user.route')

app.use(koaBody())

app.use(userRouter.routes())

app.use((ctx,next)=>{
    ctx.body = 'hello world'
})

module.exports = app
  1. 解析请求数据

改写user.controller.js文件

const {createUser} = require("../service/user.service")

class UserController {
    async register(ctx,next) {
        //1.获取数据
        const {user_name,password } = ctx.request.body
        
        // console.log(ctx.request.body);
        
        //2.操作数据库
        const res = await createUser(user_name,password)
        console.log(res);
        //3.返回结果
        ctx.body = ctx.request.body
    }
    async login(ctx,next) {
        ctx.body = "用户登录成功"
    }
}

module.exports = new UserController
  1. 拆分Service层

service主要做数据库处理

创建src/service/user.service.js

class UserService {
    async createUser(user_name,password){
        //todo:写入数据库
        return '写入数据库成功'
    }
}

module.exports = new UserService
  1. 操作数据库

Sequelized ORM数据库工具

ORM:对象关系映射

  • 数据表映射(对应)一个对象
  • 数据表中的数据行(记录)对应一个对象
  • 数据表的字段对应对象的属性
  • 数据表的操作对应对象的方法
  1. 安装sequelized

npm i sequelize

  1. 安装MySql

npm i mysql2 # MySQL

  1. 连接数据库

src/db/seq.js

const { Sequelize } = require('sequelize')
const {MYSQL_HOST
    ,MYSQL_PORT
    ,MYSQL_USER
    ,MYSQL_PWD
    ,MYSQL_DB} = require('../config/config.default')
const seq = new Sequelize(MYSQL_DB,MYSQL_USER,MYSQL_PWD,{
    host: MYSQL_HOST,
    dialect: 'mysql'
})

seq.authenticate().then(()=>{
    console.log('数据库连接成功');
}).catch((err)=>{
    console.log('数据库连接失败',err);
})

module.exports = seq
  1. 编写配置文件

.env

MYSQL_HOST = 你的服务器IP地址
MYSQL_PORT = Mysql端口号(默认3306MYSQL_USER = Mysql用户名
MYSQL_PWD = Mysql密码
MYSQL_DB = 数据库名
  1. 创建User模型

    1.   拆分model层

      sequelized主要通过Model对应数据表

      创建src/model/user.model.js

    const { DataTypes } = require('sequelize')
    const seq = require('../db/seq')
    
    //创建模型(Model zd_user -> zd_users )
    const User = seq.define('zd_user',{
        //id 会被sequelize自动创建,管理
        user_name: {
            type: DataTypes.STRING,
            allowNull: false,
            unique:true,
            comment: '用户名唯一'
        },
        password:{
            type: DataTypes.CHAR(64),
            allowNull:false,
            unique:true,
            comment:"密码"
        },
        is_admin:{
            type: DataTypes.BOOLEAN,
            allowNull:false,
            defaultValue: 0,
            comment:'是否为管理员,0不是管理员(默认),1是管理员'
        }
    
    })
    //强制同步数据库(创建数据表)
    // User.sync({force:true})
    
    module.exports = User
    
  2.   添加用户入库

  改写user.service.js
```
const User = require("../model/user.model");
class UserService {
  async createUser(user_name, password) {
    //todo:写入数据库
    const res = await User.create({
      //表的字段
      user_name,
      password,
    });
    console.log(res);
    return res.dataValues;
  }
}
module.exports = new UserService();
```
  • 改写user.controller.js
  • const {createUser} = require("../service/user.service")
    
    class UserController {
        async register(ctx, next) {
            // 1. 获取数据
            // console.log(ctx.request.body)
            const { user_name, password } = ctx.request.body
        
            // 2. 操作数据库
            const res = await createUser(user_name, password)
              // console.log(res)
              // 3. 返回结果
              ctx.body = {
                code: 0,
                message: '用户注册成功',
                result: {
                  id: res.id,
                  user_name: res.user_name,
                },
              } 
          }
        async login(ctx,next) {
            ctx.body = "用户登录成功"
        }
    }
    
    module.exports = new UserController
    
  1. 错误处理

user.controller.js

const {createUser, getUserInfo} = require("../service/user.service")

class UserController {
    async register(ctx, next) {
        // 1. 获取数据
        // console.log(ctx.request.body)
        const { user_name, password } = ctx.request.body
        //合法性
         if(!user_name||!password){
          console.error('用户名或密码为空',ctx.request.body);
          ctx.status = 400
          ctx.body = {
            code: '10001',
            message: ' 用户名或密码为空',
            result: ''
          }
          return
        }
        //合理性
       if(await getUserInfo({user_name})){
        ctx.status = 409
        ctx.body = {
          code: '10002',
          message: '用户已经存在',
          result: ''
        }
        return
       }
        // 2. 操作数据库
        try {
          const res = await createUser(user_name, password)
          // console.log(res)
          // 3. 返回结果
          ctx.body = {
            code: 0,
            message: '用户注册成功',
            result: {
              id: res.id,
              user_name: res.user_name,
            },
          }
        } catch (err) {
          console.log(err)
          ctx.app.emit('error', userRegisterError, ctx)
        }
      }
    async login(ctx,next) {
        ctx.body = "用户登录成功"
    }
}

module.exports = new UserController

user.service.js

const User = require("../model/user.model");
class UserService {
  async createUser(user_name, password) {
    //todo:写入数据库
    const res = await User.create({
      //表的字段
      user_name,
      password,
    });
    console.log(res);
    return res.dataValues;
  }
  async getUserInfo({id,user_name,password,is_admin}){
    const whereOpt = {}
    id && Object.assign(whereOpt,{id})
    user_name && Object.assign(whereOpt,{user_name})
    password && Object.assign(whereOpt,{password})
    is_admin && Object.assign(whereOpt,{is_admin})

    const res =  await User.findOne({
      attributes:['id','user_name','password','is_admin'],
      where:whereOpt
    })

    return res?res.dataValues:null
  }
}
module.exports = new UserService();