Как подключить мое приложение к образу базы данных предприятия MySQL, развернутому на экземпляре виртуальной машины в облачной инфраструктуре oracle?

#mysql #node.js #express #sequelize.js #oracle-cloud-infrastructure

#mysql #node.js #экспресс #sequelize.js #oracle-cloud-infrastructure

Вопрос:

Я хочу подключить свое веб-приложение, которое находится в стадии разработки, к образу базы данных MySQL, развернутому на виртуальной машине в облачной инфраструктуре oracle. В настоящее время я смог развернуть образ базы данных MySQL на экземпляре виртуальной машины, и я могу подключиться к нему через CLI, а также из Workbench, установленного на моем удаленном компьютере, и создавать базы данных и запрашивать базы данных из CLI. Изменения базы данных (новая БД, создание таблиц, обновление) представлены в Workbench, а также в любой другой удаленной среде, которую я использую для подключения к виртуальной машине.

Поэтому я считаю, что база данных была правильно развернута. Проблема, с которой я сталкиваюсь прямо сейчас, когда я пытаюсь подключиться к базе данных MySQL из любого из моих приложений, заключается в том, что я получаю некоторую ошибку времени ожидания соединения, и я не могу подключиться к ней из своего кода. Я новичок в этом, и я не в состоянии понять причину этого. Я потратил немало дней, чтобы разобраться в этой проблеме. Любая помощь была бы очень признательна.

Я использую Sequelize ORM и mysql2

Ниже приведен мой файл config.json для подключения к удаленно развернутой базе данных:

 {
  "development": {
    "username": "root",
   "host": "193.122.62.76",
  "dialect": "mysql",
    "password": "*****",
    "database": "test"
  }
 

Server.js файл для настройки сервера

 const express=require('express')

const app=express()

app.use(express.json()) 
app.use(express.urlencoded({extended:true}))

app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*"); 
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization");
  res.header('Access-Control-Allow-Methods', "POST, GET, PUT, DELETE, OPTIONS");
  next();
});

var models=require('./models')

models.sequelize.sync().then(function(){
    console.log('Database looks fine')
}).catch(function(err){
    console.log(err,'Something went wrong with the db')
})

require('./routers/index')(app)
port=process.env.PORT || 3000
app.listen(port,console.log('server up'))
 

index.js файл в моделях:

 'use strict';

const fs = require('fs');
const path = require('path');
const Sequelize = require('sequelize');
const basename = path.basename(__filename);
const env = process.env.NODE_ENV || 'development';
const config = require(__dirname   '/../config/config.json')[env];
const db = {};

let sequelize;
if (config.use_env_variable) {
  sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
  sequelize = new Sequelize(config.database, config.username, config.password, config);
}

fs
  .readdirSync(__dirname)
  .filter(file => {
    return (file.indexOf('.') !== 0) amp;amp; (file !== basename) amp;amp; (file.slice(-3) === '.js');
  })
  .forEach(file => {
    const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes);
    db[model.name] = model;
  });

Object.keys(db).forEach(modelName => {
  if (db[modelName].associate) {
    db[modelName].associate(db);
  }
});

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;
 

Ошибка тайм-аута соединения, которую я получаю:

 ConnectionError [SequelizeConnectionError]: connect ETIMEDOUT
    at ConnectionManager.connect (D:NotesNodeservertestnode_modulessequelizelibdialectsmysqlconnection-manager.js:126:17)
    at processTicksAndRejections (internal/process/task_queues.js:93:5)
    at async ConnectionManager._connect (D:NotesNodeservertestnode_modulessequelizelibdialectsabstractconnection-manager.js:318:24)
    at async D:NotesNodeservertestnode_modulessequelizelibdialectsabstractconnection-manager.js:250:32
    at async ConnectionManager.getConnection (D:NotesNodeservertestnode_modulessequelizelibdialectsabstractconnection-manager.js:280:7)
    at async D:NotesNodeservertestnode_modulessequelizelibsequelize.js:613:26
    at async MySQLQueryInterface.createTable (D:NotesNodeservertestnode_modulessequelizelibdialectsabstractquery-interface.js:225:12)
    at async Function.sync (D:NotesNodeservertestnode_modulessequelizelibmodel.js:1300:5)
    at async Sequelize.sync (D:NotesNodeservertestnode_modulessequelizelibsequelize.js:793:35) {
  parent: Error: connect ETIMEDOUT
      at Connection._handleTimeoutError (D:NotesNodeservertestnode_modulesmysql2libconnection.js:178:17)
      at listOnTimeout (internal/timers.js:554:17)
      at processTimers (internal/timers.js:497:7) {
    errorno: 'ETIMEDOUT',
    code: 'ETIMEDOUT',
    syscall: 'connect',
    fatal: true
  },
  original: Error: connect ETIMEDOUT
      at Connection._handleTimeoutError (D:NotesNodeservertestnode_modulesmysql2libconnection.js:178:17)
      at listOnTimeout (internal/timers.js:554:17)
      at processTimers (internal/timers.js:497:7) {
    errorno: 'ETIMEDOUT',
    code: 'ETIMEDOUT',
    syscall: 'connect',
    fatal: true
  }
} Something went wrong with the db
 

Комментарии:

1. Добавили ли вы правило входа в свой список безопасности, чтобы разрешить CIDR вашего приложения подключаться к порту 3306? Некоторая информация здесь: ateam-oracle.com/oci-network-security-groups-vs-security-lists

Ответ №1:

Ошибка тайм-аута обычно вызвана невозможностью установить соединение с сервером. Убедитесь, что ваш сервер mysql запущен там, где вы пытаетесь подключиться, а также убедитесь, что введенные IP-адрес / порт хоста указаны правильно. Также важно убедиться, что брандмауэр настроен на разрешение доступа.

Для подключения также потребуется соответствующая политика, позволяющая разрешить доступ пользователей, который, я предполагаю, у вас есть, но не помешает проверить. Вы можете просмотреть подключение к системе БД с помощью OCI здесь — https://docs.cloud.oracle.com/en-us/iaas/Content/Database/Tasks/connectingDB.htm