Google App Engine with Cloud SQL 使用 Sequelize 部署错误
Google App Engine with Cloud SQL Deploy Error Using Sequelize
我想将我的节点应用程序部署到 App Engine 并使用云 sql mysql 和 ORM 的 Sequelize,但是我在部署时遇到以下错误,没有进一步的调试信息。
我的 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>`
您还在 app.yaml
中指定 SQL_USER
、SQL_PASSWORD
、SQL_DATABASE
作为环境变量,但调用 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
});
我想将我的节点应用程序部署到 App Engine 并使用云 sql mysql 和 ORM 的 Sequelize,但是我在部署时遇到以下错误,没有进一步的调试信息。
我的 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>`
您还在 app.yaml
中指定 SQL_USER
、SQL_PASSWORD
、SQL_DATABASE
作为环境变量,但调用 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
});