egg.js-基于node.js与koa的企业级别开发框架

官网

一,创建项目

mkdir [项目名称(不能包含中文)]
cd [项目名称(不能包含中文)]
npm init egg --[名称]
npm i
npm run dev

二,定义第一个接口

1,在app.js的controller文件夹下的home的HomeController类中使用async定义接口方法

"use strict";

const Controller = require("egg").Controller;

class HomeController extends Controller {
  async index() {
    const { ctx } = this; //ctx就是agg的内置对象
    ctx.body = "hi, egg";
  }
  async list() {
    this.ctx.body = {
      msg: "ok",
      data: [1, 2, 3, 4, 5, 6, 7],
    };
  }//接口  router中定义路由 
}

module.exports = HomeController;

2,在app.js的router.js中的module.exports中定义router.get('/list', controller.home.list);

'use strict';

/**
 * @param {Egg.Application} app - egg application
 */
module.exports = app => {
  const { router, controller } = app;
  router.get('/', controller.home.index);
  router.get('/list', controller.home.list);
};

3,访问页面看到我们返回的参数

三,新建控制器

 1,在app的controller文件夹下新建文件user.js

"use strict";

const Controller = require("egg").Controller;

class UserController extends Controller {
  async index() {
    this.ctx.body = {
      msg: "ok",
      data: [1, 2, 3, 4, 5, 6, 7],
    };
  }//定义路由
}

module.exports = UserController;

2,在app下的router.js中新增路由si

"use strict";

/**
 * @param {Egg.Application} app - egg application
 */
module.exports = (app) => {
  const { router, controller } = app;
  router.get("/", controller.home.index);
  router.get("/list", controller.home.list);
  router.get("/user/list", controller.user.index);//新增
};

四,传递参数

1

2,

 

3, 

五,跨域问题(csrf) 

1,安装

npm i egg-cors -save

2,配置插件

//config下的plugin.js添加
  cors:{
    enable: true,
    package: 'egg-cors',
  },

3,config下的config.default.js添加

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

 六,资源路由

1,在controller下创建资源路由控制器post.js文件

2,配置控制器初始代码

"use strict";
const Controller = require("egg").Controller;
class Postontroller extends Controller {
  async index() {
    this.ctx.body = "列表页";
  } //列表页
  async new() {
    this.ctx.body = "新增表单";
  } //新增表单
  async create() {
    this.ctx.body = "列表页";
  } //新增逻辑
  async show() {
    this.ctx.body = "列表页";
  } //详情
  async edit() {
    this.ctx.body = "列表页";
  } //编辑
  async update() {
    this.ctx.body = "列表页";
  } //更新
  async destroy() {
    this.ctx.body = "列表页";
  } //删除
}
module.exports = Postontroller;

3,调用资源路由,在router.js中配置

 router.resources(
    "post" /*指定前缀*/,
    "/api/post" /*指定的url */,
    controller.post
  );

4,输入尝试

http://127.0.0.1:7001/api/post/new   http://127.0.0.1:7001/api/post

5,资源路由的对应的请求方法

 七,路由分组

1,新建router目录

2,创建第一个分组user.js文件

module.exports = (app) => {
  const { router, controller } = app;
  router.resources(
    "post" /*指定前缀*/,
    "/api/post" /*指定的url */,
    controller.post
  );
};

3,在roters,js的module.exports = (app) 中引入,并将app传递

  require("./router/user")(app);

 八,连接数据库

1,安装数据库插件

npm i --save egg-sequelize mysql2

2,在config的plugin.js中引入插件

  sequelize:{
    enable: true,
    package: 'egg-sequelize',
  },

3,在config的config.default.js中配置插件

 config.sequelize = {
    dialect: "mysql",
    host: "127.0.0.1",
    username: "root",
    password: "root",
    port: 3306,
    database: "egg-live3",//数据库名称
    timezone: "+08:00",// 中国时区
    define: {
      freezeTableName: true, // 取消数据表名复数
      timestamps: true,// 自动写入时间戳 created_at updated_at
      // 字段生成软删除时间戳 deleted_at
      // paranoid: true,
      createdAt: "created_time",
      updatedAt: "updated_time",
      // deletedAt: 'deleted_time',
      // 所有驼峰命名格式化
      underscored: true,
    },
  };

4,安装数据库迁移工具

npm install --save-dev sequelize-cli

5,在跟目录下创建文件.sequelizerc,配置内容

//.sequelizerc
'use strict';

const path = require('path');

module.exports = {
  config: path.join(__dirname, 'database/config.json'),
  'migrations-path': path.join(__dirname, 'database/migrations'),
  'seeders-path': path.join(__dirname, 'database/seeders'),
  'models-path': path.join(__dirname, 'app/model'),
};

6,初始化数据库迁移工具

npx sequelize init:config
npx sequelize init:migrations//一次就行//迁移文件的地方

数据库迁移目录产生

7,修改database下的config.son文件(修改成自己的配置)

{
    "development": {
        "username": "root",
        "password": "root,
        "database": "egg-live3",
        "host": "127.0.0.1",
        "dialect": "mysql"
    },
    "test": {
        "username": "root",
        "password": null,
        "database": "database_test",
        "host": "127.0.0.1",
        "dialect": "mysql"
    },
    "production": {
        "username": "root",
        "password": null,
        "database": "database_production",
        "host": "127.0.0.1",
        "dialect": "mysql"
    }
}

 8,创建数据库

npx sequelize db:create

9,第三十七个视频卡住,抛出错误,数据库引擎不支持,然后下载了mysql8的版本后创建成功,如果没有看见表就重新打开表软件,就可以看到了

https://blog.csdn.net/slience_me/article/details/109456555

10,创建数据迁移表

npx sequelize migration:generate --name=[表名称]

 11,配置创建的表文件

"use strict";

module.exports = {
  async up(queryInterface, Sequelize) {
    const { INTEGER, STRING, DATE } = Sequelize;
    await queryInterface.createTable("demoUser", {
      id: {
        type: INTEGER(20), //INTEGER类型, 长度20
        primaryKey: true, //主键
        autoIncrement: true, //符号demo_
      }, //id字段
      username: {
        type: STRING(30), //30字符以内
        allowNull: false, //不允许为null
        defaultValue: "", //默认值
        comment: "用户名", //备注
        unique: true, //唯一
      },
      password: {
        type: STRING,
        allowNull: false,
        defaultValue: "",
        comment: "密码",
      },
      avatar: {
        type: STRING,
        allowNull: true,
        defaultValue: "",
        comment: "头像",
      },
      created_time: DATE, //创建时间
      updated_time: DATE, //更新时间
    });
  }, //写入

  async down(queryInterface, Sequelize) {
    return queryInterface.dropTable("user");
  }, //回退
};

12,运行创建

npx sequelize db:migrate

 13,运行数据回滚,打开是清除数据的作用

npx sequelize db:migrate:unde

 九,sequelize 模型

1,创建app/model/user.js模型文件,实现对表的增删改查

2,配置内容(注意,大写字母会转化位-加小写)

const crypto = require("crypto");
module.exports = (app) => {
  const { INTEGER, STRING, DATE } = app.Sequelize;
  const User = app.model.define("demoUser", {
    id: {
        type: INTEGER(20),//INTEGER类型, 长度20
        primaryKey: true,//主键
        autoIncrement: true,//符号
      },//id字段
      username: {
        type: STRING(30),//30字符以内demo_user
        allowNull: false,//不允许为null
        defaultValue: "",//默认值
        comment: "用户名",//备注
        unique: true,//唯一
      },
      password: {
        type: STRING,
        allowNull: false,
        defaultValue: "",
        comment: "密码",
      },
      avatar: {
        type: STRING,
        allowNull: true,
        defaultValue: "",
        comment: "头像",
      },
      // coin: {
      //   type: INTEGER,
      //   allowNull: false,
      //   defaultValue: 0,
      //   comment: "金币",
      // },
      created_time: DATE,//创建时间
      updated_time: DATE,//更新时间
  },{
    timestamps:true,//是否自动写入时间戳
    tableName:'demo-user'//自定义数据表名称
  });
  return User;
};

3,在接口中配置访问创建文件

 async userQuery() {
   let res= await this.app.model.User.create({
      username: "张三",
      password: "1234",
      avatar: "",
    }); //拿到模型  调用创建方法
    console.log(res,'我是接收创建的对象')
    console.log(this.ctx.request.body);
    this.ctx.body = {
      msg: "ok",
      data: this.ctx.request.body,
    };
  }

4,重新启动表,发现创建成功

5,批量新增

   async userQuery() {
    //  let res= await this.app.model.User.create({
    //     username: "张三",
    //     password: "1234",
    //     avatar: "",
    //   }); //拿到模型  调用创建方法//新增单个
    let res = await this.app.model.User.bulkCreate([
      {
        username: "张三2",
        password: "1234",
        avatar: "",
      },
      {
        username: "张三3",
        password: "1234",
        avatar: "",
      },
    ]); //批量新增
    console.log(res, "我是接收创建的对象");
    console.log(this.ctx.request.body);
    this.ctx.body = {
      msg: "ok",
      data: this.ctx.request.body,
    };
  }

6,配置修改器实现密码的加密

mode/user.js中的password添加set方法
    password: {
        type: STRING,
        allowNull: false,
        defaultValue: "",
        comment: "密码",
        set(val) {
          // console.log(val, "接收到的密码");
          this.setDataValue("password", val + "修改后的结果");
        },
      },

7,单个查询

    let res = await this.app.model.User.findByPk(this.ctx.params.id); //单个查询  主键

8,多个查询

    let res = await this.app.model.User.findAndCountAll(); //多个查询

9,获取器

mode/user.js中的password添加get方法 
  // created_time: DATE, //创建时间
      created_time: {
        type: DATE,
        get() {
          const val = this.getDataValue("created_time"); //获取原始的数据
          return new Date(val).getTime();
        },
      },

9,条件查询

     let Op = this.app.Sequelize.Op;
    let res = await this.app.model.User.findAll({
      where: {
        // username: "张三4",
        password: {
          [Op.like]: "%23%", //模糊匹配
        },
        id: {
          [Op.gt]: 3, //大于3
        },
      },
      // attributes:['id','username']//查询结果限制
      attributes: {
        exclude: ["password"], //排除
      },
      order: [
        ["id", "ASC"], //排序 DESC
        ["created_time", "ASC"],
      ],
      limit: 1, //只显示1条
      offeslt: 0, //偏移  从哪一条开始
    }); //多个查询
    this.ctx.body = res;

10,修改

    let data = await this.app.model.User.findByPk(4); //单个查询  主键
    data.username = "修改了的张三";
    let res = data.save();
//  let res = data.save({ fieIds: ["username"] });//限制只修改
    this.ctx.body = res;

 11,修改多个参数

    let data = await this.app.model.User.findByPk(5); //单个查询  主键
    // data.username = "修改了的张三";
    let res =await data.update(params);//params传递的参数,字段加字段值的对象

12,删除

    let data = await this.app.model.User.findByPk(5); //单个查询  主键
    // data.username = "修改了的张三";
    // let res = data.update(params);
    let res =await data.destroy();

13,批量删除

   let Op = this.app.Sequelize.Op;
    let res = await this.app.model.User.destroy({
      where: {
        id: {
          [Op.lte]: 7,
        },
      },
    }); //批量删除

14,错误中间件

(1)新建app/middleware/error_handler.js文件

module.exports = (option, app) => {
  return async function errorHandler(ctx, next) {
    console.log("我是errorHandler");
    try {
      await next(); //错误捕获
    } catch (error) {
      console.log(error, "出错了");
      ctx.status = error.status;
    }
    // return next();
  };
};

(2)config/config.default.js使用中间件

  // add your middleware config here
  config.middleware = ['errorHandler'];

(3)logs中查看抛出的异常历史

(4)配置错误记录

   console.log(error, "出错了");
      ctx.app.emit("error", error, ctx);//所有的异常都在app上触发一个error事件,框架会记录一条错误日志
      ctx.status = error.status;

(5)配置特定情况不走中间件

  // use for cookie sign key, should change to your own and keep security
  config.keys = appInfo.name + "_1658483148084_2554";

  // add your middleware config here
  config.middleware = ["errorHandler"];
  config.errorHandler = {
    enable: true, //是否开启中间件
    // match: "/user/addInfo", //中间件匹配,路由匹配
    // match: ["/user/addInfo", "/user/read"], //中间件匹配,路由匹配   支持函数配置match(ctx){}
    ignore: ['"/user/addInfo"'],
  };

 十,参数验证

 1,安装

npm i egg-valparams --save

2,配置config/plugin.js

  valparams: {
    enable: true,
    package: "egg-valparams",
  },

3,配置config/config.default.js

  config.valparams = {
    locale: "zh-cn", //使用中文
    throwError: true, //是否自动抛出异常
  };

4,配置参数校验

//路由函数内  
this.ctx.vaidate({
      username: {
        type: "string", //类型
        defValie: "张三", //默认值
        required: true /*是否必填*/,
        desc: "用户名" /*别名 */,
      },
    });
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值