mysql - 使用 Sequelize 进行 Cloud SQL 部署时出现 Google App Engine 错误

标签 mysql node.js google-app-engine sequelize.js google-cloud-sql

我想将我的 Node 应用程序部署到应用程序引擎,并使用云 sql mysql 和 Sequelize 进行 ORM,但是我在部署时收到以下错误,没有进一步的信息可供调试。

我的 yaml 是(经过编辑的详细信息):

env: flex
runtime: nodejs
env_variables:
  SQL_USER: -
  SQL_PASSWORD: -
  SQL_DATABASE: -
  INSTANCE_CONNECTION_NAME: -

  beta_settings:
  cloud_sql_instances: -

Unable to connect to SQL database: undefined Uncaught Error { filename: '/app/node_modules/sequelize/lib/dialects/mysql/connection-manager.js', line: 133, row: 19, message: 'connect ENOENT /cloudsql/app:europe-west1:db', type: 'SequelizeConnectionError', stack: 'SequelizeConnectionError: connect ENOENT /cloudsql/app:europe-west1:db\n at Promise.tap.then.catch.err (/app/node_modules/sequelize/lib/dialects/mysql/connection-manager.js:133:19)\n at tryCatcher (/app/node_modules/bluebird/js/release/util.js:16:23)\n at Promise._settlePromiseFromHandler (/app/node_modules/bluebird/js/release/promise.js:512:31)\n at Promise._settlePromise (/app/node_modules/bluebird/js/release/promise.js:569:18)\n at Promise._settlePromise0 (/app/node_modules/bluebird/js/release/promise.js:614:10)\n at Promise._settlePromises (/app/node_modules/bluebird/js/release/promise.js:690:18)\n at _drainQueueStep (/app/node_modules/bluebird/js/release/async.js:138:12)\n at _drainQueue (/app/node_modules/bluebird/js/release/async.js:131:9)\n at Async._drainQueues (/app/node_modules/bluebird/js/release/async.js:147:5)\n at Immediate.Async.drainQueues [as _onImmediate] (/app/node_modules/bluebird/js/release/async.js:17:14)\n at runCallback (timers.js:705:18)\n at tryOnImmediate (timers.js:676:5)\n at processImmediate (timers.js:658:5)', arguments: undefined }

ORM 代码:

const sequelize = new Sequelize(process.env.DB_NAME, process.env.DB_USER, process.env.DB_PASS, {
      dialect: 'mysql',
      host: '/cloudsql/app:europe-west1:db',
      pool: {
          max: 5,
          min: 0,
          acquire: 30000,
          idle: 10000
      },
      dialectOptions: {
          socketPath: '/cloudsql/app:europe-west1:db'
      },
      logging: false
    });

最佳答案

首先,你的app.yaml不应该有beta_settings:缩进:

...
  INSTANCE_CONNECTION_NAME: <YOUR_INSTANCE_CONNECTION_NAME>

beta_settings:
  cloud_sql_instances: <YOUR_INSTANCE_CONNECTION_NAME>

接下来,unix 套接字位于 /cloudsql/<YOUR_INSTANCE_CONNECTION_NAME> 。您应该使用您在 app.yaml 中指定的环境变量以编程方式设置:

socketPath: util.format('/cloudsql/%s', process.env.INSTANCE_CONNECTION_NAME), // '/cloudsql/<YOUR_INSTANCE_CONNECTION_NAME>`

您还指定 SQL_USER , SQL_PASSWORD , SQL_DATABASE作为你的 app.yaml 中的环境变量,但请调用process.env.DB_USER , process.env.DB_PASS , process.env.DB_NAME 。如果您希望它们具有任何值,它们就必须保持一致。

最后,Sequelize 不太清楚如何最好地使用 unix 套接字 - hostdialectOptions.socketPath可能不应该同时设置。从Sequelize docs来看,我建议只使用 socketPath :

const sequelize = new Sequelize(process.env.DB_NAME, process.env.DB_USER, process.env.DB_PASS, {
      dialect: 'mysql',
      pool: {
          max: 5,
          min: 0,
          acquire: 30000,
          idle: 10000
      },
      dialectOptions: {
          socketPath: util.format('/cloudsql/%s', process.env.INSTANCE_CONNECTION_NAME),
      },
      logging: false
    });

关于mysql - 使用 Sequelize 进行 Cloud SQL 部署时出现 Google App Engine 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55986496/

相关文章:

node.js - Socket IO WebSocket 请求被公司防火墙阻止。

google-app-engine - JPA 与 App Engine 上的低级数据存储

mysql - 如何在 RHEL 7.4 上安装 cloudstack

mysql - 填充部分填充的表 MYSQL

php - 事务 MySql 和 php

php - 电子邮件营销统计实现

node.js - Webpack 错误 : Invalid configuration object. Webpack 已使用与 API 模式不匹配的配置对象初始化

java - 使用 Tomcat 或 Node.js 的 RESTful API?

java - 将使用 Maven 创建的项目上传到 Google App Engine

python - 解析传入 Google App Engine 的邮件中的 unicode 附件名称