在我的node.js应用程序中,我做了一个npm安装btoa-atob,这样我就可以使用btoa()和atob()函数,这些函数在客户端javascript中是原生的,但由于某种原因没有包含在node中。新目录出现在我的node_modules文件夹中,它本身和app.js一起在根目录下。然后我确保在包中添加btoa-atob作为依赖项。Json文件,在根目录下。
然而,由于某种原因,它仍然不能工作。
console.log(btoa("Hello World!"));
^应该输出“SGVsbG8gV29ybGQh”到控制台,但是相反,我得到了错误:
Btoa没有定义。
我没有正确地安装吗?我忽略了什么?
我的团队在与React Native和PouchDB一起使用Node时遇到了这个问题。下面是我们的解决方法……
NPM安装缓冲区:
$ npm install --save buffer
确保Buffer、btoa和atob作为全局变量加载:
global.Buffer = global.Buffer || require('buffer').Buffer;
if (typeof btoa === 'undefined') {
global.btoa = function (str) {
return new Buffer(str, 'binary').toString('base64');
};
}
if (typeof atob === 'undefined') {
global.atob = function (b64Encoded) {
return new Buffer(b64Encoded, 'base64').toString('binary');
};
}
'btoa-atob'模块不导出编程接口,它只提供命令行实用程序。
如果你需要转换为Base64,你可以使用Buffer:
console.log(Buffer.from('Hello World!').toString('base64'));
反向(假设你解码的内容是utf8字符串):
console.log(Buffer.from(b64Encoded, 'base64').toString());
注意:在Node v4之前,使用new Buffer而不是Buffer.from。
这里发布的解决方案不适用于非ascii字符(即,如果你计划在Node.js和浏览器之间交换base64)。为了让它工作,你必须把输入文本标记为“二进制”。
Buffer.from('Hélló wórld!!', 'binary').toString('base64')
这将得到SOlsbPMgd/NybGQhIQ==。如果您在浏览器中创建atob('SOlsbPMgd/NybGQhIQ=='),它将以正确的方式解码它。它也会在Node.js中通过:
Buffer.from('SOlsbPMgd/NybGQhIQ==', 'base64').toString('binary')
如果你不做“二进制部分”,你会解码错误的特殊字符。
我从btoa npm包的实现中得到它: