1. 起步
纯讲理论知识大家可能会觉得很枯燥乏味,所以我个人习惯采用代码结合理论的形式为大家阐述 Egg 的一些关键知识点。
Egg 的环境要求:Node >= 8.x,npm >= 6.1.0。
这里我们使用 Egg 为我们提供的脚手架生成指令,几行代码就能初始化一个 Egg 项目,如下:
$ mkdir egg
$ cd egg
$ npm init egg --type=simple
$ yarn 或者 npm i
注意: 这里不用npm的原因是npm install 会出现一些奇奇怪怪的问题,一路按回车就可以了。![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FmNLJzZU-1647254733137)(C:\Users\dualseason\Desktop\node全栈掘金记账本.assets\1647231464229.png)]](https://img-blog.csdnimg.cn/eb718d14d23548f9aa09e02fd65f908b.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAUmVhY3RTcHJpbmc=,size_20,color_FFFFFF,t_70,g_se,x_16)
我们来看一下egg项目的目录,和 Java 的MVC架构差不多,controller是控制层、service是业务层。
app
controller
home.js
router.js
config
config.default.js
plugin.js
router.js
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8bwbKX28-1647254733138)(C:\Users\dualseason\Desktop\node全栈掘金记账本.assets\1647234001026.png)]](https://img-blog.csdnimg.cn/5318c6dc34a84853a9b9d2edf1dbf695.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAUmVhY3RTcHJpbmc=,size_20,color_FFFFFF,t_70,g_se,x_16)
上面代码是监听路径/ ,访问/ 后会调用controller.home.index 的方法,如下
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R7tUOcyo-1647254733139)(C:\Users\dualseason\Desktop\node全栈掘金记账本.assets\1647234033705.png)]](https://img-blog.csdnimg.cn/5c3fe801512c4a07b44546364880a585.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAUmVhY3RTcHJpbmc=,size_20,color_FFFFFF,t_70,g_se,x_16)
ctx.body 就是返回的JSON 对象,我们启动代码看看
$ yarn run dev
访问localhost:7001
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EVWwt1Hp-1647254733140)(C:\Users\dualseason\Desktop\node全栈掘金记账本.assets\1647235074322.png)]](https://img-blog.csdnimg.cn/4128c2579e534a70adebbf4857a2a2ed.png)
2. 连接mysql 数据库
$ yarn add egg-mysql
在config/plugin.js 添加插件配置:
'use strict';
module.exports = {
mysql: {
enable: true,
package: 'egg-mysql'
}
};
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cUZkVhdo-1647254733142)(C:\Users\dualseason\Desktop\node全栈掘金记账本.assets\1647236248437.png)]](https://img-blog.csdnimg.cn/76c5e68a3bee4e32a48f7cfd0a54255a.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAUmVhY3RTcHJpbmc=,size_20,color_FFFFFF,t_70,g_se,x_16)
在 config/config.default.js ,添加 mysql 连接配置项和 安全威胁 csrf 的防范 :
config.mysql = {
client: {
host: 'localhost',
port: '3306',
user: 'root',
password: '数据库密码',
database: 'test',
},
app: true,
agent: false,
};
config.security = {
csrf: {
enable: false,
ignoreJSON: true
},
domainWhiteList: [ '*' ],
};
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vmnk7Iwu-1647254733145)(C:\Users\dualseason\Desktop\node全栈掘金记账本.assets\1647236525140.png)]](https://img-blog.csdnimg.cn/e48aebba92ba4ce48cfa57529460f597.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAUmVhY3RTcHJpbmc=,size_20,color_FFFFFF,t_70,g_se,x_16)
- 查询用户(注意添加顺序,先service层后controller层,最后添加路由,否则会找不到对应的路径报错)
async user() {
const { ctx, app } = this;
let sql = `select id,name from test`;
try {
const result = await app.mysql.query(sql);
return result;
} catch (e) {
console.log(e);
return null;
}
}
async user() {
const { ctx } = this;
const result = await ctx.service.home.user();
ctx.body = result;
}
router.get('/user', controller.home.user);
- 增加用户
async addUser(name) {
const { ctx, app } = this;
try {
const result = await app.mysql.insert('test', { name });
return result;
} catch (e) {
console.log(e);
return null;
}
}
async addUser() {
const { ctx } = this;
const { name } = ctx.request.body;
try {
const result = await ctx.service.home.addUser(name);
ctx.body = {
code: 200,
msg: '添加成功',
data: null
}
} catch (error) {
ctx.body = {
code: 500,
msg: '添加失败',
data: null
}
}
}
router.post('/add-user', controller.home.addUser);
- 修改用户
async editUser(id, name) {
const { ctx, app } = this;
try {
let result = await app.mysql.update('test', { name }, {
where: {
id
}
});
return result;
} catch (error) {
console.log(error);
return null;
}
}
async editUser() {
const { ctx } = this;
const { id, name } = ctx.request.body;
try {
const result = await ctx.service.home.editUser(id, name);
ctx.body = {
code: 200,
msg: '修改成功',
data: null
}
} catch (error) {
ctx.body = {
code: 500,
msg: '修改失败',
data: null
}
}
}
router.post('/edit-user', controller.home.editUser);
- 删除用户
async deleteUser(id) {
const { ctx, app } = this;
try {
let result = await app.mysql.delete('test', { id });
return result;
} catch (error) {
console.log(error);
return null;
}
}
async deleteUser() {
const { ctx } = this;
const { id } = ctx.request.body;
try {
const result = await ctx.service.home.deleteUser(id);
ctx.body = {
code: 200,
msg: '删除成功',
data: null
}
} catch (error) {
ctx.body = {
code: 500,
msg: '删除失败',
data: null
}
}
}
router.post('/delete-user', controller.home.deleteUser);
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VIVeEgPC-1647254733146)(C:\Users\dualseason\Desktop\node全栈掘金记账本.assets\1647245389056.png)]](https://img-blog.csdnimg.cn/4dee362c4f804f418806794f9b33c2d5.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAUmVhY3RTcHJpbmc=,size_20,color_FFFFFF,t_70,g_se,x_16)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gEZBRCUR-1647254733147)(C:\Users\dualseason\Desktop\node全栈掘金记账本.assets\1647245403788.png)]](https://img-blog.csdnimg.cn/f0dec18e93fd46b9ac9194c1c07155d5.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAUmVhY3RTcHJpbmc=,size_20,color_FFFFFF,t_70,g_se,x_16)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6U3bg6fK-1647254733148)(C:\Users\dualseason\Desktop\node全栈掘金记账本.assets\1647245362760.png)]](https://img-blog.csdnimg.cn/4686adb2c0a74b8ca092dd5661b6195c.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAUmVhY3RTcHJpbmc=,size_20,color_FFFFFF,t_70,g_se,x_16)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3CODOqPI-1647254733150)(C:\Users\dualseason\Desktop\node全栈掘金记账本.assets\1647245415589.png)]](https://img-blog.csdnimg.cn/000cb20e3b3c49fbb924cc50769c439d.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAUmVhY3RTcHJpbmc=,size_20,color_FFFFFF,t_70,g_se,x_16)
|