You need to enable JavaScript to run this app. Node.js使用pg库连接查询PostgreSQL时触发ERR_INVALID_ARG_TYPE报错
优惠活动
大模型
产品
解决方案
定价
更多

Node.js使用pg库连接查询PostgreSQL时触发ERR_INVALID_ARG_TYPE报错

兽医诊所管理系统PostgreSQL连接SASL认证报错排查

故障表现

  • 业务场景:开发阶段执行SELECT * FROM medico ORDER BY nome查询、将返回的医生数据渲染到前端页面时,持续抛出ERR_INVALID_ARG_TYPE类型错误
  • 错误链路:异常来自node-postgres库的SASL认证处理流程,与SQL查询语句本身的语法、逻辑无关
  • 核心报错信息:Node.js内置crypto模块生成HMAC值时抛出异常,要求key参数必须为字符串、Buffer、TypedArray、DataView或KeyObject类型,实际接收到的参数值为null

已完成的排查工作

  • 逐字段核对本地PostgreSQL连接参数:用户名、主机地址、数据库名、密码、端口均与数据库实际配置完全匹配,不存在参数错填问题
  • 单独在数据库客户端执行同一段查询SQL,可正常返回medico表的全部数据,确认SQL语句本身无执行问题

根因定位

  • 代码存在重复实例化连接池的问题:路由业务逻辑中引用的是无参初始化的const pool = new Pool(),后续定义的带完整连接参数的new Pool()是完全独立的另一个实例,从未被业务路由实际引用。
  • 无参初始化的Pool实例会默认从系统环境变量读取数据库连接配置,当环境变量未配置对应数据库密码时,传入SASL认证流程的密码值为null,最终触发crypto模块生成HMAC时因参数类型不合法抛出异常,与手动配置的连接参数完全无关。
  • 模块加载顺序问题会放大这个问题:由于第一个无参的Pool实例先被加载到路由模块的作用域中,后续定义的带配置的Pool实例即使参数正确,也不会被业务代码调用。

修复方案

  • 移除所有重复的Pool实例化代码,仅保留一份带完整连接配置的连接池定义,将该实例统一导出,供所有路由业务代码导入使用
  • 彻底清理所有无参的new Pool()初始化语句,避免生成空配置的独立连接池
  • 修复后验证:查询流程可正常完成SASL认证,不再触发null值参数导致的crypto模块类型错误,medico表数据可正常读取并渲染到页面

内容的提问来源于stack exchange,提问作者Marco Aurélio Lopes Júnior

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 16:15:05