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

Mongoose中Base64与二进制编解码问题求助

问题:MongoDB中存储的Buffer签名数据无法还原为原始Base64字符串

场景复现

使用react-signature-canvas生成Base64格式签名字符串,通过以下代码转Buffer后存入MongoDB:

let data = req.body.submittedSig.data;
let split = data.split(',');
let base64string = split[1];
const buffer = Buffer.from(base64string, 'base64');

// 存入数据库的字段结构
submittedSig: {
    data: buffer,
    contentType: plan.submittedSig.contentType
},

数据库中存储结果如下:

submittedSig: {
    "data": BinData(0, 'iVBORw0KGgoAAAANSUhEUgAAAJYAAABsCAYAAACICEudAAANIElEQVR4Xu2dSwgsRxWGjaj4CKjgxpVzjYrowidowOAoxMcmKgqi…'),
    "contentType": "image/png"
}

遇到的问题

尝试解码回Base64时:

  • 调用.toBase64()方法提示「not a function」错误
  • 使用Buffer.from(data, 'base64').toString('base64')或直接调用.toString('base64'),得到的是Buffer数组或十六进制格式的Binary对象,无法还原为原始Base64字符串

解决方案

核心原因

从MongoDB取出的data是MongoDB Binary类型对象(非Node.js原生Buffer),不能直接调用Buffer的方法,需先提取内部Buffer再处理。

具体处理代码

情况1:使用MongoDB官方驱动(返回Binary实例)

// 假设从数据库查询得到的文档为planDoc
const binaryObj = planDoc.submittedSig.data;
// 提取内部的Buffer对象
const buffer = binaryObj.buffer;
// 转换为Base64字符串
const originalBase64 = buffer.toString('base64');
// 若需要还原为完整的data URI格式
const dataUri = `data:${planDoc.submittedSig.contentType};base64,${originalBase64}`;

情况2:使用Mongoose(默认已转为Buffer)

Mongoose会自动将MongoDB的BinData转为Node.js Buffer,直接调用toString即可:

const buffer = planDoc.submittedSig.data;
const originalBase64 = buffer.toString('base64');
const dataUri = `data:${planDoc.submittedSig.contentType};base64,${originalBase64}`;

情况3:取出的是十六进制字符串

如果意外得到的是BinData的十六进制内容,可通过以下方式转换:

const hexStr = planDoc.submittedSig.data.toString('hex');
const buffer = Buffer.from(hexStr, 'hex');
const originalBase64 = buffer.toString('base64');

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 02:45:17