1

我试图在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实例,如果它可以连接到本地?

+0

请阅读本指南:https://cloud.google.com/appengine/docs/flexible/nodejs/ using-cloud-sql#setting_connection_strings_and_adding_a_library,您应该使用UNIX套接字/ cloudsql/...来连接而不是IP。如果您通过IP连接,则必须处理IP白名单。 – Vadim

+0

通过'config.socketPath =/cloudsql/...'使用UNIX套接字并删除IP会产生错误'未处理的拒绝错误:连接ECONNREFUSED 127.0.0.1:5432'和最终的nginx 502。为什么会这样? – jshapy8

+0

原因是因为'config.socketPath'只用于'MySQL'。由于我使用的是PostgreSQL,我需要使用'config.host' – jshapy8

回答

1

根据Vadmin的评论,UNIX套接字必须用于从App Engine连接到Cloud SQL,否则必须涉及IP白名单,这是一些没有指导如何做的事情。

要做到这一点,我们简单地改变从35.194.32.254host到UNIX插座/cloudsql/my-project-12345:us-central1:mydatabase

module.exports = require('knex')({ 
    client: 'pg', 
    debug: true, 
    connection: { 
     host : '/cloudsql/esp-mobile-182605:us-central1:esp-db', // 127.0.0.1 for local testing, 35.194.32.254 to locally use hosted db on Cloud SQL 
     user: 'postgres', 
     password: 'seniordesign', 
     database: 'esp_db' 
    }, 
}); 
相关问题