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' 
    }, 
}); 
相關問題