You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Render发布Node.js应用时遭遇PostgreSQL连接ECONNREFUSED错误

问题:Render部署Node.js+PostgreSQL应用时出现ECONNREFUSED错误

问题描述

本地运行可正常从PostgreSQL查询数据,但在Render平台发布应用时出现连接拒绝错误,错误显示尝试连接::1:5432和127.0.0.1:5432均被拒绝。

错误信息

Connection error: AggregateError [ECONNREFUSED]:
  at internalConnectMultiple (node:net:1116:18)
  at afterConnectMultiple (node:net:1683:7) {
code: 'ECONNREFUSED',
 [errors]: [
  Error: connect ECONNREFUSED ::1:5432
    at createConnectionError (node:net:1646:14)
    at afterConnectMultiple (node:net:1676:16) {
  errno: -111,
  code: 'ECONNREFUSED',
  syscall: 'connect',
  address: '::1',
  port: 5432
},
Error: connect ECONNREFUSED 127.0.0.1:5432
    at createConnectionError (node:net:1646:14)
    at afterConnectMultiple (node:net:1676:16) {
  errno: -111,
  code: 'ECONNREFUSED',
  syscall: 'connect',
  address: '127.0.0.1',
  port: 5432
}
]
}

相关代码文件

index.js

require('dotenv').config();
const express = require("express")
const app = express()
const path = require("path")
const tasarim = path.join(__dirname,'../tasarim')
const fs = require('fs');
const port = process.env.PORT || 3000;


app.listen(port, () => {
   console.log('uygulama başarılı bir şekilde açılıyor ');
});
app.use('/tasarim', express.static('tasarim'));

app.use('/images', express.static('images'));
app.engine('html', require('ejs').renderFile);
app.use(express.json())
app.set("view engine","ejs")
app.set("views",tasarim)

app.use(express.urlencoded({
   extended:false
}))



const { Client } = require('pg');
const client = new Client({
  host: process.env.DB_HOST,
  port: process.env.DB_PORT,
  database: process.env.DB_NAME,
  user: process.env.DB_USER,
  password: process.env.DB_PASSWORD, 
});

client.connect()
  .then(() => console.log('PostgreSQL veritabanına bağlandı'))
  .catch(err => console.error('Bağlantı hatası', err));




app.get("/", async (req, res) => {
try {
   let query = 'SELECT * FROM users WHERE 1=1'; 

   
   
   res.render(path.join(__dirname, '..', 'tasarim', 
    'index.ejs'), { 
       users,
      
   });
} catch (err) {
   console.error('Veri alınamadı:', err);
   res.status(500).send('Veri alınamadı');
 }
});

.env文件

DB_USER=
DB_PASSWORD=
DB_NAME=
DB_HOST=localhost
DB_PORT=5432

错误原因

  1. 本地与部署环境的数据库地址差异:本地.env中DB_HOST设为localhost,本地运行时指向本机的PostgreSQL服务;但在Render部署后,应用运行在独立容器中,localhost指向容器自身,而容器内没有运行PostgreSQL,因此连接被拒绝。
  2. 未使用Render PostgreSQL的正确连接信息:Render平台上的PostgreSQL服务是独立部署的,拥有专属的外部连接地址,而非localhost。

解决方法

1. 获取Render PostgreSQL的连接信息

  • 登录Render控制台,找到你的PostgreSQL服务实例
  • 进入Connections标签页,复制完整的External Database URL,或者单独提取Host、Port、Database、User、Password信息

2. 配置Render应用的环境变量

  • 进入你的Node.js应用的Render控制台,切换到Environment标签
  • 添加以下环境变量,值使用Render PostgreSQL提供的对应信息:
    • DB_HOST
    • DB_PORT
    • DB_NAME
    • DB_USER
    • DB_PASSWORD
  • 注意:不要将本地的.env文件上传到部署环境,Render会自动读取你设置的环境变量。

3. 修正代码中的查询逻辑(重要)

你的GET /路由中仅定义了查询语句,但未执行查询也未获取users变量,需补充代码:

app.get("/", async (req, res) => {
try {
   let query = 'SELECT * FROM users WHERE 1=1'; 
   // 执行查询并获取结果
   const result = await client.query(query);
   const users = result.rows;
   
   res.render(path.join(__dirname, '..', 'tasarim', 
    'index.ejs'), { 
       users,
      
   });
} catch (err) {
   console.error('Veri alınamadı:', err);
   res.status(500).send('Veri alınamadı');
 }
});

4. 确认数据库连接权限

确保Render的PostgreSQL服务允许你的Node.js应用连接(默认Render会自动配置允许同账户下的应用连接,若使用外部数据库则需将Render应用的IP加入数据库白名单)。

内容的提问来源于stack exchange,提问作者yusuf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 08:25:56