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
相关产品推荐
相关产品推荐

