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

Node.js连接Heroku Postgres:查询数据无法在页面展示求助

如何将Heroku Postgres的users数据展示在页面上?

问题背景

你的应用已经成功连接Heroku上的Postgres数据库,并且能在日志里看到users表的内容,但当前访问根路径/时页面只显示固定的Wassup!,想要把数据库里的用户数据展示到页面上。

先看看你提供的日志片段(能正确输出用户数据,说明数据库连接和查询本身没问题):

2020-05-19T15:30:34.072537+00:00 app[web.1]: {"id":1,"name":"Athlestan","joined":"2020-05-19T08:42:12.705Z","lastvisit":null,"counter":0}
2020-05-19T15:30:34.072640+00:00 app[web.1]: {"id":2,"name":"Ragnar","joined":"2020-05-19T08:42:12.705Z","lastvisit":null,"counter":0}
...

你的核心问题在于:数据库查询是在服务器启动时一次性执行的,只把结果打印到日志,没有和路由关联起来;而根路由/只是返回固定字符串,所以页面看不到数据。


解决方案步骤

1. 调整数据库连接逻辑

你用的是pg.Pool(连接池),这很好,但不要在查询后直接调用client.end()——连接池的作用就是复用连接,关闭后后续请求就没法再查询数据库了。另外,Heroku的Postgres需要SSL连接,记得加上配置。

2. 把查询逻辑和路由绑定

修改根路由的处理函数,让每次访问/时都去查询数据库,然后把结果返回给页面。

完整修改后的代码示例

var express = require("express");
var app = express();
var port = process.env.PORT || 3000;
const Pool = require('pg').Pool;

// 初始化连接池,保留连接供后续请求使用
const pool = new Pool({
  connectionString: process.env.DATABASE_URL,
  // Heroku Postgres要求SSL连接,添加这个配置
  ssl: {
    rejectUnauthorized: false
  }
});

// 修改根路由,查询数据并返回给页面
app.get("/", function(req, res){
  pool.query('SELECT * FROM users;', (err, result) => {
    if (err) {
      console.error('查询出错:', err);
      return res.status(500).send('获取用户数据失败');
    }

    // 这里用简单的HTML列表展示数据,你可以改成更美观的样式
    let pageContent = `
      <h1>用户列表</h1>
      <ul>
        ${result.rows.map(user => 
          `<li>ID: ${user.id} | 姓名: ${user.name} | 加入时间: ${user.joined}</li>`
        ).join('')}
      </ul>
    `;
    res.send(pageContent);
  });
});

app.listen(port, () => {
  console.log(`服务器已启动,端口:${port}`);
});

关于你写的getUsers函数

你的getUsers有个小坑:参数里的res(响应对象)和查询回调里的res重名了,会覆盖掉路由的响应对象。可以改成这样,作为独立的接口使用:

const getUsers = (req, res) => {
  console.log('正在获取数据...');
  pool.query('SELECT * FROM users', (error, result) => { // 把回调里的res改成result
    if (error) {
      throw error;
    }
    console.log('数据获取完成');
    // 返回JSON格式的用户数据
    res.json(result.rows);
  });
}

// 添加新路由,访问/users就能拿到JSON数据
app.get("/users", getUsers);

关键注意点

  • 连接池不需要手动关闭,它会自动管理连接的创建和复用。
  • 必须添加SSL配置,否则Heroku Postgres会拒绝连接。
  • 返回内容可以是HTML(用于页面展示)或者JSON(用于前端AJAX请求),根据你的需求选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 17:17:27