Google App Engine с облачным SQL Deploy Ошибка при использовании Sequelize - PullRequest
0 голосов
/ 04 мая 2019

Я хочу развернуть приложение узла на движке приложения и использовать облако 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: неопределено Uncaught Ошибка {имя файла: '/app/node_modules/sequelize/lib/dialects/mysql/connection-manager.js', строка: 133, строка: 19, сообщение: 'connect ENOENT / cloudsql / app: europe-west1: db', тип: 'SequelizeConnectionError', стек: 'SequelizeConnectionError: connect ENOENT / cloudsql / app: europe-west1: db \n в Promise.tap.then.catch.err (/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 / blue)bird / 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(timers.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
    });

1 Ответ

0 голосов
/ 06 мая 2019

Во-первых, у вашего 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 в качестве переменных env в app.yaml,но звоните process.env.DB_USER, process.env.DB_PASS, process.env.DB_NAME.Они должны быть последовательными, если вы хотите, чтобы они имели какие-либо значения.

Наконец, Sequelize несколько неясно, как лучше использовать сокет Unix - host и dialectOptions.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
    });
...