我試圖在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