首页 > 解决方案 > 如何将我的应用程序与 MySQL 数据库作为 Oracle 云基础架构上的服务连接?

问题描述

我想将处于开发阶段的 Web 应用程序连接到 MySQL 数据库作为 Oracle 云基础设施中的服务。目前,我已经能够将 MySQL 数据库配置为服务,并且能够通过服务器 CLI 以及远程 PC 上安装的 Workbench 连接到它,并从 CLI 创建和查询数据库。数据库更改(新数据库、表创建、更新)在 Workbench 以及我用来连接到数据库服务的任何其他远程环境中表示。

所以我相信数据库已经正确部署。当我尝试从我的任何应用程序中连接到 MySQL DBS 时,我现在面临的问题是我收到一些连接超时错误,并且我无法从我的代码中连接到它。我是新手,我无法理解这背后的原因。我花了好几天的时间来找出问题所在。任何帮助将不胜感激。

我正在使用 Sequelize ORM 和 mysql2

下面是我用于连接远程部署数据库的 config.json 文件:

{
  "development": {
    "username": "johndoe",
   "host": "10.0.1.3",
  "dialect": "mysql",
    "password": "Oraclecloud1@",
    "database": "test"
  },

host 是 MySQL 在远程 130.61.183.23 实例地址上运行的位置。

Server.js 文件,用于在我的机器上设置本地节点 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 || 3003
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) && (file !== basename) && (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:\Notes\Node\servertest\node_modules\sequelize\lib\dialects\mysql\connection-manager.js:126:17)
    at processTicksAndRejections (internal/process/task_queues.js:93:5)
    at async ConnectionManager._connect (D:\Notes\Node\servertest\node_modules\sequelize\lib\dialects\abstract\connection-manager.js:318:24)
    at async D:\Notes\Node\servertest\node_modules\sequelize\lib\dialects\abstract\connection-manager.js:250:32
    at async ConnectionManager.getConnection (D:\Notes\Node\servertest\node_modules\sequelize\lib\dialects\abstract\connection-manager.js:280:7)
    at async D:\Notes\Node\servertest\node_modules\sequelize\lib\sequelize.js:613:26
    at async MySQLQueryInterface.createTable (D:\Notes\Node\servertest\node_modules\sequelize\lib\dialects\abstract\query-interface.js:225:12)
    at async Function.sync (D:\Notes\Node\servertest\node_modules\sequelize\lib\model.js:1300:5)
    at async Sequelize.sync (D:\Notes\Node\servertest\node_modules\sequelize\lib\sequelize.js:793:35) {
  parent: Error: connect ETIMEDOUT
      at Connection._handleTimeoutError (D:\Notes\Node\servertest\node_modules\mysql2\lib\connection.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:\Notes\Node\servertest\node_modules\mysql2\lib\connection.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

标签: mysqlnode.jsexpresssequelize.jsoracle-cloud-infrastructure

解决方案


对此进行调查,似乎可能发生了几种可能的事情,包括您的数据库未运行或您的防火墙不允许访问。我看到的另一件事包括在您的配置中添加一个池选项 - Node.js 应用程序中的 SequelizeConnectionError


推荐阅读