【问题标题】:Google App Engine with Cloud SQL Deploy Error Using Sequelize使用 Sequelize 的 Google App Engine 与 Cloud SQL 部署错误
【发布时间】:2019-05-04 20:22:33
【问题描述】:

我想将我的节点应用程序部署到应用程序引擎并使用 Cloud 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: -

无法连接到 SQL 数据库:未定义 未捕获的错误 { 文件名: '/app/node_modules/sequelize/lib/dialects/mysql/connection-manager.js', 线:133, 行:19, 消息:'连接 ENOENT /cloudsql/app:europe-west1:db', 类型:'SequelizeConnectionError', 堆: 'SequelizeConnectionError: 在 Promise.tap.then.catch.err 处连接 ENOENT /cloudsql/app:europe-west1:db\n (/app/node_modules/sequelize/lib/dialects/mysql/connection-manager.js:133:19 )\n 在 tryCatcher (/app/node_modules/bluebird/js/release/util.js:16:23)\n 在 Promise._settlePromiseFromHandler (/app/node_modules/bluebird/js/release/promise.js:512:31 )\n 在 Promise._settlePromise (/app/node_modules/bluebird/js/release/promise.js:569:18)\n 在 Promise._settlePromise0 (/app/node_modules/bluebird/js/release/promise.js:614 :10)\n 在 Promise._settlePromises (/app/node_modules/bluebird/js/release/promise.js:690:18)\n 在 _drainQueueStep (/app/node_modules/bluebird/js/release/async.js:138 :12)\n 在 _drainQueue (/app/node_modules/bluebird/js/release/async.js:131:9)\n 在 Async._drainQueues (/app/node_modules/bluebird/js/release/async.js:147 :5)\n 在 Immediate.Async.drainQueues [as _onImmediate] (/app/node_modules/bluebird/js/release/async.js:17:14)\n 在 runCallback(计时器.js:705:18)\n 在 tryOnImmediate (timers.js:676:5)\n 在 processImmediate (timers.js:658:5)', 参数:未定义}

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
    });

【问题讨论】:

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


    【解决方案1】:

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

    ...
      INSTANCE_CONNECTION_NAME: <YOUR_INSTANCE_CONNECTION_NAME>
    
    beta_settings:
      cloud_sql_instances: <YOUR_INSTANCE_CONNECTION_NAME>
    

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

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

    您还可以在app.yaml 中指定SQL_USERSQL_PASSWORDSQL_DATABASE 作为环境变量,但调用process.env.DB_USERprocess.env.DB_PASSprocess.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
        });
    

    【讨论】:

    • thanks 现在似乎已经解决了这些错误,得到了(gcloud.app.deploy) Error Response: [9] 但假设这是一个不同的问题
    • @jwarris91 抱歉,如果没有您遇到的更多错误,我无法提供任何建议。这似乎是部署本身的问题,而不是与 Cloud SQL 的连接。如果以上答案对您有帮助,请务必点赞或接受,以便其他人更轻松地评估自己的需求。
    猜你喜欢
    • 2014-08-03
    • 1970-01-01
    • 2021-12-31
    • 2021-09-25
    • 1970-01-01
    • 2020-06-02
    • 2014-04-10
    • 2020-02-02
    • 2020-03-27
    相关资源
    最近更新 更多