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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 20:13:03