node.js基础五(Egg.js框架)

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;

getselect方法获取一条或多条记录:

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"
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值