一,创建项目
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: "用户名" /*别名 */, }, });