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

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;

排查与解决方向

  1. 监听数据库连接状态
    pool.query无响应大概率是连接池无法建立数据库连接导致的,给连接池添加事件监听,直接获取连接状态和错误:

    pool.on('connect', () => {
      console.log('已连接到PostgreSQL');
    });
    
    pool.on('error', (err) => {
      console.error('PostgreSQL连接错误:', err);
    });
    
  2. 修复变量名错误
    代码中返回响应时用了未定义的todo变量,实际查询结果存在allTodos里,这个错误会导致请求挂起(即使查询成功也无法返回响应),修改为:

    // 返回所有数据
    res.json(allTodos.rows);
    // 或返回第一条数据
    res.json(allTodos.rows[0]);
    
  3. 适配Heroku环境配置
    部署到Heroku时不能用本地固定配置,需使用平台提供的环境变量:

    const pool = new Pool({
      connectionString: process.env.DATABASE_URL,
      ssl: {
        rejectUnauthorized: false // 避免Heroku SSL验证问题
      }
    });
    

    确保Heroku已添加PostgreSQL插件,且DATABASE_URL环境变量正常配置。

  4. 测试单个连接有效性
    临时替换连接池为单个客户端连接,验证数据库本身是否可访问:

    // 替换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;
    

    若单个连接能成功查询,再排查连接池的配置问题。

  5. 确认数据库权限与表名
    检查postgres用户是否有todo表的查询权限,注意PostgreSQL表名区分大小写,若表名是大写需用双引号包裹SQL语句:SELECT * FROM "Todo"。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 01:45:37