【问题标题】:Postgresql - Error Connection terminated due to connection timeoutPostgresql - 错误连接因连接超时而终止
【发布时间】:2020-11-17 08:22:04
【问题描述】:
我在谷歌云中创建了一个谷歌云函数,它将连接到我在谷歌云中创建的 postgresql 实例。
我正在使用“pg”节点模块。
我已经为此创建了一个私有 IP。
我收到以下错误:
错误:连接因连接超时而终止
Timeout.connectionTimeoutHandle.setTimeout
(/workspace/node_modules/pg/lib/client.js:106:28) 在ontimeout
(timers.js:436:11) 在 tryOnTimeout (timers.js:300:5) 在 listOnTimeout
(timers.js:263:5) 在 Timer.processTimers (timers.js:223:10)
尝试在谷歌云中查询数据库时。
这是我在谷歌云功能中使用的配置。
{
“主持人”: ””,
“用户”:“”,
"pw": "",
"db": "",
“端口”:“5432”,
"table": "
请帮我解决这个问题
【问题讨论】:
标签:
postgresql
google-cloud-platform
cloud
vpc
node-postgres
【解决方案1】:
升级 pg npm 版本解决了这个问题。
"pg": "^7.3.0",
到
"pg": "^8.7.1",
如果问题仍然存在,请检查您的节点版本。将节点升级到 >=14。
【解决方案2】:
根据官方文档:
Connecting from Cloud Functions to Cloud SQL
要直接连接私有 IP,您需要:
1.确保上面创建的 Cloud SQL 实例有私有 IP
地址。如果您需要添加一个,请参阅配置私有 IP 页面
获取说明。
2.在同一个中创建一个无服务器 VPC 访问连接器
VPC 网络作为您的 Cloud SQL 实例。除非您使用共享
VPC,连接器必须与连接器位于同一项目和区域中
使用它的资源,但连接器可以将流量发送到资源
在不同的地区。
3.配置 Cloud Functions 以使用连接器。使用您的连接
实例的私有 IP 和端口 5432。
4.使用您实例的私有 IP 和端口 5432 连接
你也可以找到node js代码来建立与数据库的连接:
const connectWithTcp = config => {
// Extract host and port from socket address
const dbSocketAddr = process.env.DB_HOST.split(':'); // e.g. '127.0.0.1:5432'
// Establish a connection to the database
return Knex({
client: 'pg',
connection: {
user: process.env.DB_USER, // e.g. 'my-user'
password: process.env.DB_PASS, // e.g. 'my-user-password'
database: process.env.DB_NAME, // e.g. 'my-database'
host: dbSocketAddr[0], // e.g. '127.0.0.1'
port: dbSocketAddr[1], // e.g. '5432'
},
// ... Specify additional properties here.
...config,
});
};