1.Egg介绍
Egg.js 为企业级框架和应用而生
和社区框架express的区别:
Express 是 Node.js 社区广泛使用的框架,简单且扩展性强,非常适合做个人项目。但框架本身缺少约定,标准的 MVC 模型会有各种千奇百怪的写法。
Egg 按照约定进行开发,奉行『约定优于配置』,团队协作成本低。
特性
提供基于 Egg 定制上层框架的能力
高度可扩展的插件机制
内置多进程管理
基于 Koa 开发,性能优异
框架稳定,测试覆盖率高
渐进式开发
2.快速入门
egg内置在npm中
初始化
直接使用脚手架,只需几条简单指令,即可快速生成项目(npm >=6.1.0
):
$ mkdir egg-example && cd egg-example //新建egg文件夹,进入该文件夹
$ npm init egg --type=simple //初始化
$ npm i //安装依赖
启动项目
$ npm run dev
$ open http://localhost:7001 //或者直接在浏览器中Localhost:7001访问
项目目录结构
app文件夹中controller(控制器)文件夹中放置服务模块
;
router文件中存放模块路由
package.json 文件:项目发布时使用start启动,挂载到后台,修改时需要stop将项目停止;开发时使用dev启动,遇到错误可以提示,修改可以更新。
service文件夹存放模块的数据处理
代码
config文件夹中plugin.js 用于注册插件
;config.default.js 用于配置插件信息
3.访问数据库
egg框架提供egg-mysql插件来访问 MySQL 数据库。
安装插件 egg-mysql(ctrl+c停止服务):
$ npm i --save egg-mysql
开启插件(注册插件):
// config/plugin.js
module.exports = {
mysql:{
enable: true,
package: 'egg-mysql',
},
};
配置数据库插件信息
单数据源
//config/config.default.js
const userConfig = { //自定义配置
mysql:{
// 单数据库信息配置
client: {
// host
host: '139.224.33.150',
// 端口号
port: '3306',
// 用户名
user: 'root',
// 密码
password: '123456',
// 数据库名
database: 'course',
},
// 是否加载到 app 上,默认开启
app: true,
// 是否加载到 agent 上,默认关闭
agent: false,
}
};
使用方式:
await app.mysql.query(sql, values);
4.service层
对 MySQL 数据库的访问操作属于 Web 层中的数据处理层,因此我们强烈建议将这部分代码放在 Service 层中维护。
Service 中访问 MySQL 数据库
service文件夹中创建student.js ,存放student模块的数据处理代码。
const Service = require('egg').Service;
class StudentService extends Service {
async findAll() {
var sql="select * from student";
const res=await this.app.mysql.query(sql);
return res;
}
async delete(id){
var sql="delete from student where id=?";
const res=await this.app.mysql.query(sql,[id]); //使用数组进行传参
return res;
}
}
module.exports=StudentService;
可以通过 Controller 获取 Service 层拿到的数据
const Controller = require('egg').Controller;
class StudentController extends Controller {
async findAll() {
const { ctx } = this;
let res=await ctx.service.student.findAll();
ctx.body = res; //response.body 对象直接转换为json
};
async delete(){
const {ctx} =this;
//这里需要做参数的验证
var id=ctx.query.id;
let res=await ctx.service.student.delete(id);
ctx.body = "删除成功"; //response.body 对象直接转换为json
}
}
在service中的数据处理代码可以写 CRUD 语句,也可以写sql语句。
CRUD语句
insert方法插入语句:
const result = await this.app.mysql.insert('student', { stu_name: 'xiaoming',sex:'男' });
// 在 student表中,插入stu_name为xiaoming,sex为男 的记录
return res;
get或select方法获取一条或多条记录:
const res= await this.app.mysql.get('student', { id: 1 }); // SELECT * FROM 'student' WHERE 'id'= 1 从student表中获取id=1的 记录
const res = await this.app.mysql.select('student'); //SELECT * FROM 'student'; 从student表中获取所有记录
return res;
Update方法更新数据:
var data={
id:1,
stu_name:'xiaoming',
sex:'男'
}
const res = await this.app.mysql.update('student', data); //更新数据记录,根据主键查找记录并更新
Delete方法删除数据库记录:
const res=await this.app.mysql.delete('student',id:1); //删除id所对应的记录
5.数据校验
需要通过egg-validate进行数据校验
安装插件
$npm i --save egg-validate
注册validate插件
config/plugin.js
module.exports = {
validate = {
enable: true,
package: 'egg-validate',
},
};
参数验证
controller/student.js
async delete(){
const {ctx} =this;
//这里需要做参数的验证
ctx.query.id=parseInt(ctx.query.id); //先进行转换(转换为整形)
var rules={id:'number'};
ctx.validate(rules,ctx.query); //再进行验证
var id=ctx.query.id;
let res=await ctx.service.student.delete(id);
ctx.body = res; //response.body 对象直接转换为json
}
6.跨域访问
当使用post方式访问时,需要进行跨域。
Egg.js跨域访问需使用egg-cors插件,典型的应用场景是前后端分离的项目中,前端与后台在不同的域下,此时若前端通过AJAX访问后端接口,此时就首先解决跨域问题。
安装egg-cors插件
$ npm i -S egg-cors
开启egg-cors插件
config/plugin.js
module.exports = {
cors:{
enable:true,
package:"egg-cors"}
}
配置跨域参数
config/config.default.js
const userConfig = {
cors:{
origin:"*",
allowMethods:"GET, HEAD, PUT, POST, DELETE, PATCH",
credentials:true
},
security:{
csrf:{
enable:false,
} //关闭csrf插件
}
}
实例:
controller/student.js
const Controller = require('egg').Controller;
class StudentController extends Controller {
async findAll() {
const { ctx } = this;
let res=await ctx.service.student.findAll();
ctx.body = res; //response.body 对象直接转换为json
};
//http://localhost:7001/student/delete?id=1
async delete(){
const {ctx} =this;
//这里需要做参数的验证
ctx.query.id=parseInt(ctx.query.id); //先进行转换(转换为整形)
var rules={id:'number'};
ctx.validate(rules,ctx.query); //再进行验证
var id=ctx.query.id;
let res=await ctx.service.student.delete(id);
ctx.body = res; //response.body 对象直接转换为json
}
async addOrUpdateUser() {
const { ctx } = this;
const res=await this.ctx.service.student.addOrUpdateUser(ctx.request.body);
ctx.body={};
};
}
module.exports = StudentController;
app/router.js
配置路由映射
module.exports = app => {
const { router, controller } = app;
router.get('/', controller.home.index);
router.get('/student/findAll', controller.student.findAll);
router.get('/student/delete',controller.student.delete);
router.get('/student/delete',controller.student.delete);
router.post('/student/addOrUpdateUser',controller.student.addOrUpdateUser);
};
config/plugin.js
配置
module.exports = {
mysql:{
enable: true,
package: 'egg-mysql',
},
validate:{
enable: true,
package: 'egg-validate',
},
cors:{
enable:true,
package:"egg-cors"
}
};
config/config.default.js
注册插件
module.exports = appInfo => {
const config = exports = {};
config.keys = appInfo.name + '_1637544199020_1496';
config.middleware = [];
const userConfig = { //自定义配置
mysql:{
// 单数据库信息配置
client: {
// host
host: '139.224.33.150',
// 端口号
port: '3306',
// 用户名
user: 'root',
// 密码
password: '123456',
// 数据库名
database: 'course',
},
// 是否加载到 app 上,默认开启
app: true,
// 是否加载到 agent 上,默认关闭
agent: false,
},
cors:{
origin:"*",
allowMethods:"GET, HEAD, PUT, POST, DELETE, PATCH",
credentials:true
},
security:{
csrf:{
enable:false,
} //关闭csrf插件
}
};
return {
...config,
...userConfig,
};
};
package.json
{
"name": "egg_server",
"version": "1.0.0",
"description": "",
"private": true,
"egg": {
"declarations": true
},
"dependencies": {
"egg": "^2.15.1",
"egg-cors": "^2.2.3",
"egg-mysql": "^3.0.0",
"egg-scripts": "^2.11.0",
"egg-validate": "^2.0.2"
},
"devDependencies": {
"autod": "^3.0.1",
"autod-egg": "^1.1.0",
"egg-bin": "^4.11.0",
"egg-ci": "^1.11.0",
"egg-mock": "^3.21.0",
"eslint": "^5.13.0",
"eslint-config-egg": "^7.1.0"
},
"engines": {
"node": ">=10.0.0"
},
"scripts": {
"start": "egg-scripts start --daemon --title=egg-server-egg_server",
"stop": "egg-scripts stop --title=egg-server-egg_server",
"dev": "egg-bin dev",
"debug": "egg-bin debug",
"test": "npm run lint -- --fix && npm run test-local",
"test-local": "egg-bin test",
"cov": "egg-bin cov",
"lint": "eslint .",
"ci": "npm run lint && npm run cov",
"autod": "autod"
},
"ci": {
"version": "10"
},
"repository": {
"type": "git",
"url": ""
},
"author": "",
"license": "MIT"
}