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

