我试图在Google Cloud App Engine上托管一个作为Node.js应用程序实现的API。 API使用的数据库是一个PostgreSQL 9.6数据库,它由云SQL实例托管。数据库通过Knex
连接到Node.js API。Cloud SQL实例连接在本地工作,但不在App Engine上
当在App Engine上托管时,不需要与数据库进行任何联系的API端点工作正常。然而,当数据库需要接触,以完成API调用,将出现以下错误日志:
Unhandled rejection TimeoutError: Knex: Timeout acquiring a connection. The pool is probably full. Are you missing a .transacting(trx) call?
但是,如果我用Knex
连接到云的SQL实例本地和地址,通过本地主机的API :3000,要求数据库完成的API调用非常好。这验证了Cloud SQL上的PostgreSQL数据库实例工作正常,并且在App Engine上托管的Node.js应用程序正在与Cloud SQL实例建立连接失败。
我连接到数据库,像这样:
module.exports = require('knex')({
client: 'pg',
debug: true,
connection: {
host : '35.194.32.254',
user : 'postgres',
password : 'mypassword',
database : 'mydatabase'
},
});
此外,本地连接成功,App Engine的连接失败。
我app.yaml
文件如下:
runtime: nodejs
env: flex
beta_settings:
cloud_sql_instances: my-project-12345:us-central1:mydatabase
为了确保这不是一个权限问题,我授予的App Engine服务帐户[email protected]
云SQL客户端许可。我还验证了Cloud SQL实例与App Engine上的Node.js应用程序部署在相同的区域。
我的问题是这样的:为什么App Engine上的Node.js连接到Cloud SQL实例,如果它可以连接到本地?
请阅读本指南:https://cloud.google.com/appengine/docs/flexible/nodejs/ using-cloud-sql#setting_connection_strings_and_adding_a_library,您应该使用UNIX套接字/ cloudsql/...来连接而不是IP。如果您通过IP连接,则必须处理IP白名单。 – Vadim
通过'config.socketPath =/cloudsql/...'使用UNIX套接字并删除IP会产生错误'未处理的拒绝错误:连接ECONNREFUSED 127.0.0.1:5432'和最终的nginx 502。为什么会这样? – jshapy8
原因是因为'config.socketPath'只用于'MySQL'。由于我使用的是PostgreSQL,我需要使用'config.host' – jshapy8