Node.js拉取PostgreSQL数据并在web页面展示时触发TypeError的排查求助
代码错误定位与可运行修正方案
直接触发TypeError的根因
代码中调用的pg.connect()是node-postgres(即pg依赖)7.x及更早版本的全局API,在pg@8.0.0之后的版本中该全局方法已被正式移除。直接在高版本依赖环境下调用这个不存在的方法,就会抛出TypeError: pg.connect is not a function,和运行时报错完全匹配。
代码中附带的其他隐性问题
- 顶部引入的
const { ENGINE_METHOD_ALL } = require('constants');是无任何实际调用的冗余代码,可直接删除 - 数据库操作的错误分支仅在服务端控制台打印日志,既没有调用
done()释放连接池资源(长期运行会耗尽数据库连接),也没有给前端返回错误响应,会导致请求挂起超时 - 原代码将
done()放在渲染逻辑之后,如果模板渲染环节抛出异常,连接会无法被及时释放
修正后的完整代码
var express = require('express'), path = require('path'), bodyParser = require('body-parser'), cons = require('consolidate'), dust = require('dustjs-helpers'), { Pool } = require('pg'), app = express(); // 显式初始化PostgreSQL连接池,替代旧版全局pg.connect逻辑 const pool = new Pool({ connectionString: "postgres://postgres:admin@localhost/db1" }); app.engine('dust', cons.dust); app.set('view engine', 'dust'); app.set('views', __dirname + '/views'); app.use(express.static(path.join(__dirname, 'public'))); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false })); app.get('/', function(req, res){ pool.connect(function(err, client, done) { if(err){ console.error('获取数据库连接失败', err); return res.status(500).send('服务暂时不可用'); } client.query('SELECT * FROM tbl_employee', function(err, result){ // 查询完成第一时间释放连接,避免连接泄漏 done(); if(err){ console.error('数据查询执行失败', err); return res.status(500).send('数据加载失败'); } res.render('index', {tbl_employee: result.rows}); }); }); }); app.listen(3000, function(){ console.log('服务已启动,监听端口3000'); });
关键修正逻辑
- 用显式创建的
Pool连接池实例替代旧版全局调用逻辑,从根源上解决pg.connect is not a function的TypeError报错 - 调整连接释放时机,无论查询成功、失败都第一时间归还连接到池,避免长期运行导致的连接耗尽
- 所有错误分支增加前端响应,避免请求无响应导致的超时问题
- 删除无实际作用的冗余依赖引入,精简代码
内容的提问来源于stack exchange,提问作者DevStar
相关产品推荐
相关产品推荐

