Prisma查询PostgreSQL bytea字段转Blob或JS读取Buffer方法
Prisma 对接 PostgreSQL 的 Bytes(对应库表bytea类型)字段时,默认返回 Node.js 原生的 Buffer 实例,你看到的 {"type":"Buffer","data":[104,101,108,108,111]} 是 Buffer 被 JSON.stringify 序列化后的标准输出,不需要做复杂的自定义解析,按以下方式处理即可:
转换为Blob返回前端
在Node.js服务端(Express、Next.js、Koa等运行环境)可以直接将Buffer转为Blob返回,注意要根据文件实际类型指定MIME值,避免前端识别文件出错:
- 直接使用Prisma查询结果(未经过JSON序列化/反序列化流程)的场景:
// 查询目标文件记录 const fileRecord = await prisma.files.findUnique({ where: { id: 1 } }) // 生成Blob,type替换为文件实际MIME,比如image/png、application/pdf、text/csv等 const fileBlob = new Blob([fileRecord.file], { type: 'application/octet-stream' // 未知类型二进制文件默认用该值 }) // 接口返回时设置响应头,触发浏览器下载行为 return new Response(fileBlob, { headers: { 'Content-Disposition': `attachment; filename="${encodeURIComponent(fileRecord.title || '未命名文件')}"` } })
- 如果拿到的是已经被序列化后的普通对象(即你贴出的带
type、data字段的结构),先还原为Buffer再生成Blob:
const recoverBuffer = Buffer.from(fileRecord.file.data) const fileBlob = new Blob([recoverBuffer], { type: 'application/octet-stream' })
直接在JavaScript中读取Buffer数据
Buffer原生提供了多场景的读取API,常用操作如下:
- 读取文本内容:指定编码调用
toString方法即可,你示例中的字节数组[104,101,108,108,111]转UTF-8文本结果为helloconst textContent = fileRecord.file.toString('utf-8') - 转Base64字符串:可用于拼接Data URL,直接内嵌到前端页面做图片/文件预览
const base64Str = fileRecord.file.toString('base64') const dataUrl = `data:对应文件MIME类型;base64,${base64Str}` - 获取原始二进制数据:支持下标直接访问字节值,也可提取ArrayBuffer供前端Web API使用
// 读取指定位置字节值 const firstByte = fileRecord.file[0] // 提取ArrayBuffer const arrayBuffer = fileRecord.file.buffer.slice( fileRecord.file.byteOffset, fileRecord.file.byteOffset + fileRecord.file.byteLength )
提示:不要手动遍历字节数组拼接二进制内容,直接使用Buffer原生API性能更高,也能避免编码、字节偏移类的错误。
内容的提问来源于stack exchange,提问作者Jessica
相关产品推荐
相关产品推荐

