-
解析body
-
安装 koa-body
npm i ``koa``-body
-
改写中间件
改写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
-
解析请求数据
改写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
-
拆分Service层
service主要做数据库处理
创建src/service/user.service.js
class UserService {
async createUser(user_name,password){
//todo:写入数据库
return '写入数据库成功'
}
}
module.exports = new UserService
-
操作数据库
Sequelized ORM数据库工具
ORM:对象关系映射
- 数据表映射(对应)一个对象
- 数据表中的数据行(记录)对应一个对象
- 数据表的字段对应对象的属性
- 数据表的操作对应对象的方法
-
安装sequelized
npm i sequelize
-
安装MySql
npm i mysql2 # MySQL
-
连接数据库
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
-
编写配置文件
.env
MYSQL_HOST = 你的服务器IP地址
MYSQL_PORT = Mysql端口号(默认3306)
MYSQL_USER = Mysql用户名
MYSQL_PWD = Mysql密码
MYSQL_DB = 数据库名
-
创建User模型
-
拆分model层
sequelized主要通过Model对应数据表
创建
src/model/user.model.jsconst { 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 -
-
添加用户入库
改写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
-
错误处理
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();