Node.js 如何做 Base64 编码和解码?
Node.js 用内置 Buffer 做 Base64:编码 Buffer.from(str).toString('base64'),解码 Buffer.from(str,'base64').toString('utf8')。本文含字符串、二进制文件、URL 安全变体的完整写法。
**编码:Buffer.from(str).toString('base64');解码:Buffer.from(str, 'base64').toString('utf8')。**无需任何依赖。
字符串编码/解码
// 编码
const original = 'Hello,这是一段要编码的文本!';
const base64 = Buffer.from(original, 'utf8').toString('base64');
console.log(base64);
// 解码
const decoded = Buffer.from(base64, 'base64').toString('utf8');
console.log(decoded);
文本编码应保持一致:Buffer.from(str) 与 Buffer 的 .toString() 都默认使用 UTF-8;显式写出便于阅读,但不是支持中文的必要条件。二进制数据不要随意转成 UTF-8 文本。
文件的 Base64
const fs = require('fs');
// 文件 → Base64(如图片转 data URI)
const fileBuffer = fs.readFileSync('photo.png');
const base64File = fileBuffer.toString('base64');
const dataUri = `data:image/png;base64,${base64File}`;
// Base64 → 文件
fs.writeFileSync('copy.png', Buffer.from(base64File, 'base64'));
URL 安全的 Base64(Base64URL)
标准 Base64 含 +、/、=,放进 URL 会出问题。Node 14.18.0 和 15.7.0 起支持 base64url,不是 Node 20 才引入:
const urlSafe = Buffer.from('hello').toString('base64url');
const back = Buffer.from(urlSafe, 'base64url').toString();
老版本手动替换:.replace(/\+/g,'-').replace(/\//g,'_').replace(/=+$/,'')。
常见坑
- Base64 不是加密——只是编码,任何人都能解码,别拿它藏密码;
- 大文件整体转 Base64 会把数据全装进内存且标准带填充编码长度为
4 * ceil(字节数 / 3),大输入约膨胀 33%,超大文件考虑流式处理; - Buffer 的 Base64 解码较宽松,可接受空白和部分变体,不能用“没有抛异常”判断输入有效;按协议验证字母表、填充和长度。
常见问题(FAQ)
Q:浏览器端的 btoa/atob 在 Node 里能用吗?
Node 16+ 全局可用 btoa/atob,btoa 接受单字节字符组成的字符串,不能直接编码中文;atob 返回字节字符串,不负责 UTF-8 文本解码——用 Buffer 才是正道。
Q:Base64 编码后体积多大?
每 3 字节变 4 字节,膨胀约 33%。
Q:JWT 里的 Base64 为什么和我编码出来的不一样?
JWT 用的是 Base64URL 变体(-/_ 替换 +//,去掉 = 填充),用 base64url 编码即可对齐。