egg

安装

$ mkdir 创建目录 && cd 创建目录
$ npm init egg --type=simple
$ npm i

网址

    // 使用post 会报 csrf token 问题   
    //   安装 : npm i egg-cors - save
    //   配置插件
    //   config/plugin.js
    // 跨域的插件
    cors: {
        enable: true,
        package: 'egg-cors'
    }
          

// config/config.default.js // 关闭csrf 开启跨域 config.security = { // 关闭csrf csrf: { enable: false }, //跨域白名单 domainWhiteList: ['http://127.0.0.1:8080'] }; // 允许跨域的方法 config.cors = { origin: '*', allowMethods: 'GET,PUT,POST,DELETE,PATCH' };

ctx

获取url问号get传值参数  :   this.ctx.query
 
获取:id 传递过来的参数  :  this.ctx.params
 
获取post请求传递的参数 : this.ctx.request.body
 
修改状态码   :   this.ctx.status
 

创建数据库和数据表

 
操作数据库和表  ==> 叫做模型
// app/model/user.js
'use strict';

module.exports = (app) => {
    const { INTEGER, STRING, DATE, ENUM } = app.Sequelize;

    // 配置(重要:一定要配置详细,一定要!!!)
    const User = app.model.define('user', {
        id: {
            type: INTEGER(20).UNSIGNED,
            primaryKey: true,  //主键
            autoIncrement: true //自增
        },
        username: {
            type: STRING(30),
            allowNull: false, //不允许为空
            defaultValue: '', //默认值为空
            comment: '用户名称', //备注用户名
            unique: true //唯一性
        },
        password: {
            type: STRING(200),
            allowNull: false,
            defaultValue: '',
        },
        avatar_url: {
            type: STRING(200),
            allowNull: false,
            defaultValue: '',
        },
        sex: {
            type: ENUM,
            values: ['男', '女', '保密'],
            allowNull: false,
            defaultValue: '男',
            comment: '用户性别',
        },
        created_at: DATE,
        updated_at: DATE,
    });

    return User;
};

这个 Model 就可以在 Controller 和 Service 中通过 app.model.User 或者 ctx.model.User 访问到了

增  :  添加数据到数据库  

create : 单条
bulkCreate : 批量
    // 创建用户
    async createUser() {
        // 如何拿到模型 : this.ctx.model.User  create({})添加入数据库
        // 1.前端传递的,后端写入数据库
        // await this.ctx.model.User.create({
        //     username:this.ctx.request.body.username,
        //     password:this.ctx.request.body.password,
        //     avatar_url:this.ctx.request.body.avatar_url || '111',
        //     sex:this.ctx.request.body.sex
        // })

        // 2.自己新增
        await this.ctx.model.User.create({
            username:'吴宇腾5',
            password:'123456',
            sex:'女'
        })

        // 3.批量新增
        // await this.ctx.model.User.bulkCreate([
        //     {
        //         username:'吴宇腾1',
        //         password:'123456',
        //         sex:'女'
        //     },
        //     {
        //         username:'吴宇腾2',
        //         password:'123456',
        //         sex:'女'
        //     },
        //     {
        //         username:'吴宇腾3',
        //         password:'123456',
        //         sex:'女'
        //     },
        // ])

        // 可以获取body返回的东西
        console.log(this.ctx.request.body);
        // 参数验证 , 写入数据库
        this.ctx.body = {
            message:'success',
        }

查 : 查询数据库的信息

findByPK : 通过主键查询单个数据
        // 1.findByPK : 通过主键查询单个数据
        // let datas = await this.ctx.model.User.findByPk(id)
        // this.ctx.body = {
        //     message:'success',
        //     data:datas
        // }

 

查询单个 -- 多个条件 findOne({where:{}})
        // 2.查询单个 -- 多个条件  findOne({where:{}})
        // let datail = await this.ctx.model.User.findOne({
        //     where:{
        //         id:id,
        //         sex:'男'
        //     }
        // })
        // this.ctx.body = {
        //     message:'success',
        //     data:datail
        // }

 

查询多个并计数 findAndCountAll
let data = await this.ctx.model.User.findAndCountAll()

 

查询多个 findAll
    async index() {   
        // 获取url问号get传值参数
        console.log(this.ctx.query);
        // 分页的功能
        let page = this.ctx.query.page
        let limit = 5
        let offset =  (page-1) * 5

        // 查询多个 findAll
        let Op = this.app.Sequelize.Op
        let data = await this.ctx.model.User.findAll({
            where:{
                sex:"女",
                // 模糊查询
                username:{
                    [Op.like]:"%吴宇腾%"
                } 
            },
            // 返回的字段
            // attributes:['id','username','sex']
            attributes:{
                // 排除掉某字段,其他全部返出
                exclude:['password']
            },
            // 排序  DESC降序   ASC升序
            order:[
                ['updated_at','DESC'],
                ['id','DESC']
            ],
            // 偏移
            offset,
            // 赛选多少条
            limit
        })
        console.log(data);
        this.ctx.body = {
            message: 'success',
            data: data
        }
        // 修改状态码
        this.ctx.status=200
    }

 

 

改  unpdate

    // 修改用户  改
    async updataUser(){
        const id = this.ctx.params.id ? parseInt(this.ctx.params.id) : 0
        console.log(id);
        
        let data = await this.ctx.model.User.findByPk(id)
        if(!data){
            this.ctx.body = {
                msg:'error',
                data:'该记录不存在'
            }
            return;
        }
        // // 第一种方法
        // data.username = '被修改了'
        // // 保存一下数据库data.save      fields 只能修改的字段
        // let res = await data.save({fields:['username']})

        // 第二种方法 update 不需要data.save()  fields 只能修改的字段
        let params = this.ctx.request.body
        let res = await data.update(params,{fields:['username']})

        this.ctx.body = {
            msg:'message',
            data:res
        }
    }

 

删  destroy

    async destroy(){
        // 软删除 : 删除一条 (数据库还是存在的)
        // let id = this.ctx.params.id 
        // let data = await this.ctx.model.User.findByPk(id)
        // if(!data){
        //     this.ctx.body = {
        //         msg:'error',
        //         data:'该记录不存在'
        //     }
        //     return
        // }
        // let res = await data.destroy()
        // this.ctx.body = {
        //     msg:'message',
        //     data:res
        // }

        // 软删除 : 批量删除
        let Op = this.app.Sequelize.Op
        let res = await this.ctx.model.User.destroy({
            where:{
                id:{
                    [Op.lte]:4
                }
            }
        })
        this.ctx.body = {
            msg:'message',
            data:res
        }

    }

 

错误日志的中间插件

 app/middleware/errora.js

module.exports = ()=>{
    return async function errora(ctx,next){
        try {
            await next()
        } catch (err) {
            // 所有的异常都在app上触发一个error事件,框架会记录一条错误日志
            ctx.app.emit('error',err,ctx)

            const status = err.status || 500;

            // 生成环境500错误不返回给客户端,因为可能包含敏感信息
            const error = status === 500 && ctx.app.config.env === 'prod' ? 'Internal Server Error' : err.message;

            // 从error对象上读取出个个属性,设置到响应中
            ctx.body = {error}
            if(status === 422){
                ctx.body.detail =  err.errors
            }
            ctx.status = status
            // ctx.body = {
            //     msg:'fail',
            //     data:error.message
            // }
        }
    }
}

config/config/default.js

  // 配置中间件的
  config.middleware = ['errora'];

使用 : 

// 抛出异常
this.ctx.throw(500,'故意出错')

 

中间件配置 

  // 配置中间件参数
  config.errora = {
      ceshi: 123,
      // 通用配置(以下是重点)
      enable:true, // 控制中间件是否开启。
      //多个配置成数组
      // match:'/user/destroy/:id', // 设置只有符合某些规则的请求才会经过这个中间件(匹配路由)
      ignore:'/user/destroy/:id' // 设置符合某些规则的请求不经过这个中间件。
      
      /**
      注意:
      1. match 和 ignore 不允许同时配置
      2. 例如:match:'/news',只要包含/news的任何页面都生效
      **/
      
      // match 和 ignore 支持多种类型的配置方式:字符串、正则、函数(推荐)
      // match(ctx) {
      //   // 只有 ios 设备才开启
      //   const reg = /iphone|ipad|ipod/i;
      //   return reg.test(ctx.get('user-agent'));
      // },
  };

 

 

 

 

修改器 : 增加和修改数据的时候会触发

        password: {
            type: STRING(200),
            allowNull: false,
            defaultValue: '',
            // 修改器
            set(val){
                let hash = val + '1123456'
                this.setDataValue('password',hash)
            }
        },

获取器

        created_at: {
            type:DATE,
            // 获取器 - 查询的时候会调用
            // this.getDataValue('created_at') 获取原始数据
            get(){
                const val = this.getDataValue('created_at')
                return (new Date(val)).getTime()
            }
        },

 

 

 

 
 
posted @ 2022-10-20 00:08  杨建鑫  阅读(125)  评论(0编辑  收藏  举报