我在 Google App Engine 中发现我的 node.js 存在问题,因为它无法连接到 Google Cloud PostgreSQL:
Unhandled rejection SequelizeBaseError: connect ETIMEDOUT ***.***.***.***:5432
at (/app/node_modules/sequelize/lib/dialects/postgres/connection-manager.js:111)
at Connection.<anonymous> (/app/node_modules/pg/lib/client.js:176)
at emitOne (events.js:96)
at Connection.emit (events.js:188)
at Socket.<anonymous> (/app/node_modules/pg/lib/connection.js:59)
at emitOne (events.js:96)
at Socket.emit (events.js:188)
at emitErrorNT (net.js:1281)
at _combinedTickCallback (internal/process/next_tick.js:74)
at process._tickCallback (next_tick.js:98)
我不确定如何在下面添加 IP 地址(也许我错过了在 Google Cloud SQL 中配置的内容)。
最佳答案
how to connect App Engine applications to Cloud SQL instances 有一些非常好的文档。您可以在此处找到有关如何让您的应用程序在本地开发和生产环境中访问 Cloud SQL 实例(针对每种受支持的编程和 SQL 语言)的详细步骤。
假设您在将应用程序部署到生产环境(即 App Engine 环境)时发现连接问题,这里总结了您必须执行的主要步骤:
- 使用命令
gcloud sql instances describe [INSTANCE_NAME]
获取 Cloud SQL 实例的全名。它的类型应该是<PROJECT_ID>:<REGION>:<INSTANCE_NAME>
. - 使用与您的 App Engine 应用程序关联的服务帐户授予对 App Engine 的访问权限。它应具有 Cloud SQL 客户端 或 Cloud SQL 编辑器 角色。
- 在
app.yaml
中为您的 SQL 实例定义环境变量和测试版设置文件。
(将此代码添加到 app.yaml
文件中,并进行编辑以适合您的参数):
env_variables:
SQL_USER: <YOUR_CLOUD_SQL_USER>
SQL_PASSWORD: <YOUR_CLOUD_SQL_PASSWORD>
SQL_DATABASE: <YOUR_CLOUD_SQL_DATABASE>
INSTANCE_CONNECTION_NAME: <INSTANCE_CONNECTION_NAME> # With format as <PROJECT_ID>:<REGION>:<INSTANCE_NAME>
beta_settings:
cloud_sql_instances: <INSTANCE_CONNECTION_NAME> # With same format
- 使用
package.json
将 Node.js PostreSQL 客户端库添加到您的应用程序中文件。文档建议使用 Knex.js 和 pg,但想必您将能够使用您选择的一个。
(将此代码添加到 package.json
文件):
"dependencies": {
"async": "2.5.0",
"express": "4.15.4",
"knex": "0.13.0",
"pg": "7.3.0",
"prompt": "1.0.0"
},
<小时/>
为应用程序设置正确的配置后,您可以查看此 sample Node.js code 。为了找到主脚本中丢失的项目。
如果您现在部署应用程序,它应该会发挥作用。
P.S.:请记住,由于 App Engine 和 Cloud SQL 是 Google Cloud Platform 系列的两款产品,因此无需在 Cloud SQL 实例中授权外部网络,因此您也可以忽略这一部分。
关于node.js - 如何允许 Google App Engine 访问 Google Cloud PostgreSQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48023713/