Node.js连接Heroku Postgres:查询数据无法在页面展示求助
问题背景
你的应用已经成功连接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

