Nest.js+Knex查询Postgres bytea字段编码异常,需返回Base64
问题原因
PostgreSQL的bytea字段存储的是二进制数据,Knex依赖的pg驱动默认会将bytea类型的查询结果解析为十六进制编码的字符串(即你看到的以\x开头的格式),而非直接返回原始的Base64字符串。这是因为bytea本质是二进制存储,驱动默认用十六进制格式来表示二进制数据,而非Base64。
解决方法
方法1:让PostgreSQL直接返回Base64字符串
利用PostgreSQL内置的encode函数,在查询时将bytea字段直接转换为Base64格式:
// 替换your_table为你的表名 knex.select(knex.raw('encode("binary", \'base64\') as binary')).from('your_table')
这样查询返回的binary字段就是前端可直接解析的Base64字符串,无需额外处理。
方法2:手动将十六进制字符串转换为Base64
如果已经拿到了带\x前缀的十六进制字符串,可通过Node.js的Buffer工具转换:
// 假设result是Knex查询返回的结果对象 const hexString = result[0].binary.replace(/^\\x/, ''); // 移除开头的\x前缀 const base64String = Buffer.from(hexString, 'hex').toString('base64');
方法3:配置驱动返回Buffer再转Base64
修改Knex的连接配置,让pg驱动将bytea字段解析为Buffer对象,之后再转成Base64:
const knex = require('knex')({ client: 'pg', connection: { // 你的数据库连接信息 host: 'localhost', user: 'your_user', password: 'your_password', database: 'your_db', // 配置BYTEA类型解析为Buffer types: { parse: { BYTEA: (value) => Buffer.from(value, 'hex') } } } }); // 查询后转换 const queryResult = await knex('your_table').select('binary'); const base64String = queryResult[0].binary.toString('base64');
内容的提问来源于stack exchange,提问作者jawn
相关产品推荐
相关产品推荐

