云SQL实例连接在本地工作,但不能在App Engine上
我想作为托管在谷歌的云应用程序引擎的Node.js应用程序实现的API。该API利用该数据库是一个与云SQL实例承载一个PostgreSQL 9.6数据库。该数据库连接到通过Knex
Node.js的API。
当在App Engine上托管的API端点不需要与数据库做工精细任何接触。然而,当数据库需要接触,以完成API调用,出现在日志中出现以下错误:
未处理的拒绝TimeoutError:Knex:超时取得联系。池可能是满的。是否缺少.transacting(TRX)调用?
但是,如果我用Knex
通过本地主机连接到云SQL实例本地和解决API:3000,API调用需要数据库完成完美的罚款。这验证了在Cloud SQL的PostgreSQL数据库实例工作正常,并在App Engine上被托管正在迁移到云SQL实例失败的连接是一些关于兴田的Node.js应用。
我连接到像这样的数据库:
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
为了确保这不是一个权限问题,我理所当然[email protected]
云SQL客户端许可的App Engine服务帐户。我也验证了云SQL实例部署在同一区域在App Engine上的Node.js应用。
我的问题是:为什么不能Node.js加载在App引擎连接到云SQL实例,如果它可以连接到它在本地?
回答如下:按照瓦迪姆的评论,UNIX插座必须使用从App Engine的连接到云SQL否则IP白名单必须参与,这东西对于如何做小导游。
要做到这一点,我们简单地改变从host
到Unix套接字35.194.32.254
的/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'
},
});