egg链接多个数据库 获取客户端IP地址

本文详细介绍了如何在Egg.js框架中配置和使用sequelize插件连接多个MySQL数据库,包括数据库配置、模型定义以及数据库操作。同时,文章也展示了如何配置egg-oracle插件连接Oracle数据库,以及获取客户端IP地址的方法。内容涵盖数据库连接、事务处理和服务层调用。
摘要由CSDN通过智能技术生成

sequelize数据库配置

安装并配置egg-sequelize插件

npm install --save egg-sequelize mysql2

 配置插件plugin.js

'use strict';

/** @type Egg.EggPlugin */
module.exports = {

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

};

egg-sequelize 链接多个数据库  /config/config.default.js 配置

// config.default.js
config.sequelize = {
// 定义多个数据库使用
  datasources: [
    {
      delegate: 'model', // 加载所有的模型到 app.model and ctx.model
      baseDir: 'model', // 要加载的模型目录`app/model/*.js`
      database: 'db',
      dialect: 'mysql',
      host: 'ip',
      port: 'port',
      username: 'root',
      password: 'root',
      // 中国时区
        timezone: '+08:00',
        define: {
          // 取消数据表名复数
          freezeTableName: true,
          // 自动写入时间戳 created_at updated_at
          timestamps: true,
          // 字段生成软删除时间戳 deleted_at
          // paranoid: true,
          createdAt: 'created_time',
          updatedAt: 'updated_time',
          // deletedAt: 'deleted_time',
          // 所有驼峰命名格式化
          underscored: true
        }
    },
    {
      delegate: 'logModel', // 加载所有的模型到 app.logModel and ctx.logModel
      baseDir: 'model_log', // 要加载的模型目录 `app/model_log/*.js`
      database: 'db_log',
      dialect: 'mysql',
      host: 'ip',
      port: 'port',
      username: 'root',
      password: 'root',
       // 中国时区
        timezone: '+08:00',
        define: {
          // 取消数据表名复数
          freezeTableName: true,
          // 自动写入时间戳 created_at updated_at
          timestamps: true,
          // 字段生成软删除时间戳 deleted_at
          // paranoid: true,
          createdAt: 'created_time',
          updatedAt: 'updated_time',
          // deletedAt: 'deleted_time',
          // 所有驼峰命名格式化
          underscored: true
        }
    },
  ]
};

注意:model层配置

model:app.model.define

// app/model/type.js

module.exports = app => {
    const { STRING, INTEGER, DATE, ENUM, TEXT } = app.Sequelize;
  
    const Type = app.model.define('type', {
        id: {
            type: INTEGER(20),
            primaryKey: true,
            autoIncrement: true,
            unique: true
          },
       
        created_time:DATE,
        updated_time: DATE,
    });
  
  
    return Type;
  };

model_log:app.logModel.define

// app/model/type.js

module.exports = app => {
    const { STRING, INTEGER, DATE, ENUM, TEXT } = app.Sequelize;
  
    const Type = app.logModel.define('type', {
        id: {
            type: INTEGER(20),
            primaryKey: true,
            autoIncrement: true,
            unique: true
          },
     
        created_time:DATE,
        updated_time: DATE,
    });
  
  
    return Type;
  };

调用

// db
this.ctx.model.modelName;
// db_log
this.ctx.logModel.modelName;

egg-oracle 链接多个数据库

客户端oracle下载链接Instant Client for Microsoft Windows (x64) 64-bit

根据本地或远程服务器下载的oracle版本  来下载客户端对应的版本

比如本地版本是:

下载对应的客户端就是:

instantclient-basiclite-windows.x64-12.1.0.2.0.zip

instantclient-sdk-windows.x64-12.1.0.2.0.zip

把这两个文件解压到:C:\oracle\instantclient_12_1   文件目录不同 ,不会相互覆盖

远程连接oracle数据库

  配置环境变量:

path中新增2条:

C:\oracle\instantclient_12_1\vc12

C:\oracle\instantclient_12_1

使用egg-oracle插件配置

npm i egg-oracle --save

/config/plugin.js 配置

'use strict';

/** @type Egg.EggPlugin */
module.exports = {

  oracle :{
    enable: true,
    package: 'egg-oracle',
    }
};

/config/config.default.js 配置 

config.oracle = {
  clients: {
    //await this.app.oracle.get('db1').getConnection();   获取不同的数据库
    db1:{
      user: 'user', //用户名
      password: 'password', //密码
      //IP:数据库IP地址,PORT:数据库端口,SCHEMA:数据库名称
      connectString: 'ip',
    },
     //await this.app.oracle.get('db2').getConnection();   获取不同的数据库
    db2:{
      user: 'user', //用户名 mes_trace
      password: 'password', //密码 Trace$9dec
      //IP:数据库IP地址,PORT:数据库端口,SCHEMA:数据库名称
      connectString: 'ip', //ip
    },
  },
  };

调用

app/service/tool.js

'use strict';

const Service = require('egg').Service;

class ToolService extends Service {
  //查询数据
  async echo(e) {
    const connection = await this.app.oracle.get('db1').getConnection();
    const result = await connection.execute(e);
    connection.close();
   // console.log(result.rows[0]);
    //封装返回为JSON格式
    function resut(result){
        let titleList = result.metaData;
                let ddList = result.rows;
                let allList = [];
                for (let i = 0; i < ddList.length; i++) {
                    let itemList = ddList[i];
                    let ibj = {};
                    for (let j = 0; j < itemList.length; j++) {
                        //console.log(titleList[j].name +"-"+ itemList[j])
                        ibj[titleList[j].name] = itemList[j];
                    }
                    allList.push(ibj)
                }
                return allList
    }
    return resut(result)
  }
  //插入数据
  async echoindex(e) {
    let connection;
    try {
       
        connection = await this.app.oracle.get('db1').getConnection();
 
        //插入数据库自增的序列号SEQ_ACCOUNT.nextval
      let res=   await connection.execute(e)

        //提交事务
      await connection.commit();
        //释放连接
        connection.close();
       
        if(res.rowsAffected && res.rowsAffected>0){
          return 1
        }else{
          return 0
        }
       
    } catch (err) {
        console.error(err);

        //异常:则进行事务回滚
        if(connection!=undefined && connection!=null){
            await connection.rollback();
            await connection.close();
        }

        //执行回调:传入异常信息
        return err
    }

  }
}

module.exports = ToolService;

获取客户端IP地址

1.配置egg.js

路径 config/config.default.js

// 注意,开启此模式后,应用就默认自己处于反向代理之后,
// 会支持通过解析约定的请求头来获取用户真实的 IP,协议和域名。
// 如果你的服务未部署在反向代理之后,请不要开启此配置,以防被恶意用户伪造请求 IP 等信息。
config.proxy = true;

2. 配置nginx

     #访问Tomcat API  请求服务器的代理api
    location /api/ {
        root   html;
        index  index.html index.htm;
        # 获取ip地址 前3个开启
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Real-Port $remote_port;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_pass http://10.122.122.122:7001/;
    }

3. 获取ip

  //菜单列表
  async menulist(){
    const { ctx, app } = this;
    const new_ip = ctx.request.ip;            // 获取ip
    console.log(new_ip,'-----ip--------')
  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时光浅止

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值