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

Fastify+node-postgres使用PGP_SYM_ENCRYPT报错:函数不存在

解决Fastify调用PGP_SYM_ENCRYPT报错的问题

排查方向及解决办法

1. 扩展所在schema不在用户搜索路径里

pgcrypto可能装在了非public的schema下,而Fastify连接的数据库用户默认搜索路径没包含这个schema,导致找不到函数。

  • 先查扩展位置:SELECT nspname FROM pg_extension WHERE extname = 'pgcrypto';
  • 临时修复:在Fastify初始化数据库连接后,先执行SET search_path TO public, 你的扩展schema;(把你的扩展schema换成查询到的结果)
  • 永久修复:ALTER USER 你的数据库用户 SET search_path TO public, 你的扩展schema;

2. 参数类型不匹配

PGP_SYM_ENCRYPT有多个重载版本,要是Fastify传的参数不是text类型(比如传了Buffer或者null),PostgreSQL就找不到对应的函数。

  • 强制转换参数类型:在SQL里写pgp_sym_encrypt($1::text, '你的密钥')
  • 检查传入参数:确保要加密的字段是字符串,别传非text类型的数据

3. 连接的数据库不对

确认Fastify配置里的database和DBeaver用的是同一个库,别把pgcrypto装在了另一个库,却在Fastify里连了没装的那个。

4. 参数化查询写法错了

用@fastify/postgres这类插件时,别把函数名或密钥错误地放到占位符里。要直接把函数名写在SQL语句里,示例:

// 正确写法
db.query('INSERT INTO your_table (encrypted_col) VALUES (pgp_sym_encrypt($1, $2))', [plainText, secretKey])

快速验证

在Fastify路由里先执行这条查询:SELECT * FROM pg_proc WHERE proname = 'pgp_sym_encrypt';,看看返回结果里有没有text, text类型的重载,确认当前用户能访问到这个函数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 12:25:06