Node.js使用pg库查询既无结果也不报错仅返回未决议Promise
排查优先级
异步调用未处理
你贴出的socketserver.js中,ws.on('message')的回调是同步函数,内部调用的parseMessage如果未声明为async、且调用addMessage时未加await,就会直接拿到未决议的Promise:
异步函数不等待的情况下,内部执行逻辑完全脱离当前上下文,不仅返回值是pending状态,就算内部抛出错误、或者查询执行完成,你也无法感知到,INSERT语句不生效就是因为请求还没发往数据库,上层逻辑已经继续执行后续流程了。
修复方案:- 将
parseMessage声明为async函数,调用addMessage时加await - 给
ws.on('message')的回调加异常捕获,避免异步错误被静默:
ws.on('message', async (data) => { try { await parseMessage(ws, socket_id, data) } catch (err) { console.error('消息处理错误', err) } })- 将
全局异常规则吞错
检查项目是否配置了全局unhandledRejection、uncaughtException监听,有没有把数据库抛出的连接错误、语法错误直接吞掉不打印日志,导致你看不到具体报错。同时确认日志输出等级,console.error的内容没有被过滤。连接池排队阻塞
pg的Pool默认最大连接数为10,如果有其他模块长期占用连接不释放,新的查询会进入排队队列,长期处于pending状态不会返回也不报错。可调用db.query前后打印连接池状态验证:
console.log('等待队列长度', db.waitingCount) console.log('空闲连接数', db.idleCount) console.log('总连接数', db.totalCount) const res = await db.query('select 1')
如果waitingCount持续大于0,就需要排查其他模块的连接泄漏问题。
内容的提问来源于stack exchange,提问作者hernanl
相关产品推荐
相关产品推荐

