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);
中文必须显式处理 UTF-8:Buffer.from(str) 默认就是 UTF-8,但解码时如果不写 'utf8' 参数在某些场景会得到二进制 Buffer 再转字符串出错,养成显式指定的习惯。
文件的 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 20 直接支持 base64url:
const urlSafe = Buffer.from('hello').toString('base64url');
const back = Buffer.from(urlSafe, 'base64url').toString();
老版本手动替换:.replace(/\+/g,'-').replace(/\//g,'_').replace(/=+$/,'')。
常见坑
- Base64 不是加密——只是编码,任何人都能解码,别拿它藏密码;
- 大文件整体转 Base64 会把数据全装进内存且体积膨胀约 33%,超大文件考虑流式处理;
- 解码非法字符串不会报错而是静默产生乱码,对外部输入要先校验格式。
常见问题(FAQ)
Q:浏览器端的 btoa/atob 在 Node 里能用吗?
Node 16+ 全局可用 btoa/atob,但它们只支持 Latin-1 字符,中文直接报错——用 Buffer 才是正道。
Q:Base64 编码后体积多大?
每 3 字节变 4 字节,膨胀约 33%。
Q:JWT 里的 Base64 为什么和我编码出来的不一样?
JWT 用的是 Base64URL 变体(-/_ 替换 +//,去掉 = 填充),用 base64url 编码即可对齐。