部署在Digital Ocean的Node.js应用生产环境出现ECONNREFUSED错误
问题诊断与解决方案
错误根源
你的错误 ECONNREFUSED ::1:5432 和 ECONNREFUSED 127.0.0.1:5432 明确指向核心问题:生产环境中Node.js应用在尝试连接本地(localhost)的PostgreSQL数据库,但App Platform的应用容器内并未部署PostgreSQL服务。这和async/await用法无关,本质是数据库连接配置错误。
开发环境正常是因为你本地运行了PostgreSQL,而生产环境的App Platform容器默认不内置数据库,必须连接外部托管数据库(比如Digital Ocean官方的托管PostgreSQL服务)。
解决方案步骤
1. 修正数据库连接配置
检查你的数据库初始化代码(比如db实例的创建部分),确保生产环境使用远程数据库地址而非localhost:
- 用环境变量管理配置:在Digital Ocean App Platform的应用设置中添加以下环境变量:
DB_HOST:托管PostgreSQL的主机地址(如xxx.db.ondigitalocean.com)DB_PORT:默认5432DB_USER:数据库用户名DB_PASSWORD:数据库密码DB_NAME:目标数据库名称
- 代码中从环境变量读取配置,示例:
const { Pool } = require('pg'); const pool = new Pool({ host: process.env.DB_HOST, port: process.env.DB_PORT, user: process.env.DB_USER, password: process.env.DB_PASSWORD, database: process.env.DB_NAME, ssl: { rejectUnauthorized: false } // Digital Ocean托管DB需要开启SSL });
2. 配置数据库访问权限
如果使用Digital Ocean托管PostgreSQL:
- 进入托管DB控制面板的Connections选项卡,将App Platform的应用IP加入Trusted Sources;或选择允许任意地址连接(需配合强密码保证安全)。
- 优先将应用和托管DB部署在同一VPC下,无需额外IP配置即可安全连接。
3. 验证环境变量加载
在应用启动日志中确认环境变量是否正确加载,可临时添加日志代码:
console.log('生产环境DB配置:', { host: process.env.DB_HOST, port: process.env.DB_PORT });
如果输出仍为localhost,说明环境变量未正确设置或代码未读取到。
4. 优化代码潜在问题(非当前错误根源,避免后续故障)
你的代码存在async/await与回调混用、错误处理不完整的情况,可优化:
- 将bcrypt的回调写法改为Promise形式,减少嵌套:
// 替换原bcrypt.hash回调逻辑 const hash = await bcrypt.hash(password, saltRounds); const user = await createCompanyAccount(email, hash, officeaddress, latCoords, lngCoords); req.login(user.rows[0], (err) => { if (err) return next(err); res.redirect("/dashboard"); }); - Passport策略的catch块需调用
cb(err),避免请求挂起:catch (err) { console.log(err); return cb(err); // 补充这行,将错误传递给Passport }
内容的提问来源于stack exchange,提问作者Saeb Masarwa
相关产品推荐
相关产品推荐

