使用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
错误原因
- 本地与部署环境的数据库地址差异:本地
.env中DB_HOST设为localhost,本地运行时指向本机的PostgreSQL服务;但在Render部署后,应用运行在独立容器中,localhost指向容器自身,而容器内没有运行PostgreSQL,因此连接被拒绝。 - 未使用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_HOSTDB_PORTDB_NAMEDB_USERDB_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
相关产品推荐
相关产品推荐

