Express无法从PostgreSQL获取数据,无报错且请求阻塞
问题:Express + PG连接池请求无响应,无法获取PostgreSQL数据
使用Express做路由、Node Postgres(PG)连接池,访问localhost或用POSTMAN测试/todos路由时,请求一直处于加载状态无响应。跟着视频部署PERN应用到Heroku,克隆仓库并更新依赖后,仍无法从PostgreSQL获取数据。连接池信息确认正确,数据库内有可用表和数据。
代码中,路由能打印“route hit”,但执行pool.query后无后续日志,也无响应,且无任何报错信息,排查困难。
相关代码
Server代码
const express = require("express"); const app = express(); const cors = require("cors"); const pool = require("./db"); app.use(cors()); app.use(express.json()); app.get("/todos", async (req, res) => { try { console.log("route hit"); // 请求发送时会打印此消息 const allTodos = await pool.query("SELECT * FROM todo"); console.log("route hit again"); // 请求发送时不会打印此消息 res.json(todo.rows[0]); } catch (err) { console.error(err.message); } }); app.listen(5000, () => { console.log("server has started on port 5000"); });
Pool配置代码
const Pool = require("pg").Pool; const pool = new Pool({ user: "postgres", password: "postgres", host: "localhost", port: 5432, database: "perntodo" }); module.exports = pool;
排查与解决方向
监听数据库连接状态
pool.query无响应大概率是连接池无法建立数据库连接导致的,给连接池添加事件监听,直接获取连接状态和错误:pool.on('connect', () => { console.log('已连接到PostgreSQL'); }); pool.on('error', (err) => { console.error('PostgreSQL连接错误:', err); });修复变量名错误
代码中返回响应时用了未定义的todo变量,实际查询结果存在allTodos里,这个错误会导致请求挂起(即使查询成功也无法返回响应),修改为:// 返回所有数据 res.json(allTodos.rows); // 或返回第一条数据 res.json(allTodos.rows[0]);适配Heroku环境配置
部署到Heroku时不能用本地固定配置,需使用平台提供的环境变量:const pool = new Pool({ connectionString: process.env.DATABASE_URL, ssl: { rejectUnauthorized: false // 避免Heroku SSL验证问题 } });确保Heroku已添加PostgreSQL插件,且
DATABASE_URL环境变量正常配置。测试单个连接有效性
临时替换连接池为单个客户端连接,验证数据库本身是否可访问:// 替换db.js的内容 const { Client } = require('pg'); const client = new Client({ user: "postgres", password: "postgres", host: "localhost", port: 5432, database: "perntodo" }); client.connect().catch(err => console.error('连接失败:', err)); module.exports = client;若单个连接能成功查询,再排查连接池的配置问题。
确认数据库权限与表名
检查postgres用户是否有todo表的查询权限,注意PostgreSQL表名区分大小写,若表名是大写需用双引号包裹SQL语句:SELECT * FROM "Todo"。
内容的提问来源于stack exchange,提问作者Elco
相关产品推荐
相关产品推荐

