Node.js – “btoa未定义”错误
在我的node.js应用程序中,我做了一个npm install btoa-atob
这样我就可以使用客户端javascript中原生的btoa()和atob()函数,但由于某种原因未包含在节点中。 新的目录显示在我的node_modules文件夹中,它本身在app.js的根目录下。 然后,我确定添加btoa-atob作为依赖项,位于我的package.json文件中。
但是,由于某种原因,它仍然无法正常工作。
console.log(btoa("Hello World!"));
^应该输出“SGVsbG8gV29ybGQh”到控制台,但是我得到错误“btoa不是defiend”。
我没有正确安装吗? 我忽略了什么?
'btoa-atob'模块不导出编程接口,它只提供命令行工具。
如果你需要转换到Base64,你可以使用Buffer:
console.log(Buffer.from('Hello World!').toString('base64'));
反向(假设你正在解码的内容是一个utf8string):
console.log(Buffer.from(b64Encoded, 'base64').toString());
注意:在Node v4之前,使用new Buffer
而不是Buffer.from
。
当使用Node with React Native和PouchDB时,我的团队遇到了这个问题。 这是我们如何解决它…
NPM安装缓冲区:
$ npm install --save buffer
确保Buffer
, btoa
和atob
被加载为全局variables:
global.Buffer = global.Buffer || require('buffer').Buffer; if (typeof btoa === 'undefined') { global.btoa = function (str) { return new Buffer(str).toString('base64'); }; } if (typeof atob === 'undefined') { global.atob = function (b64Encoded) { return new Buffer(b64Encoded, 'base64').toString(); }; }
我发现尽pipe上述答案中的垫片起作用,但它们与btoa()
和atob()
的桌面浏览器实现的行为不匹配:
const btoa = function(str){ return Buffer.from(str).toString('base64'); } // returns "4pyT", yet in desktop Chrome would throw an error. btoa('✓'); // returns "fsO1w6bCvA==", yet in desktop Chrome would return "fvXmvA==" btoa(String.fromCharCode.apply(null, new Uint8Array([0x7e, 0xf5, 0xe6, 0xbc])));
事实certificate, Buffer
实例默认表示/解释以UTF-8编码的string。 相比之下,在桌面版Chrome中,甚至不能将包含latin1范围之外的字符的stringinput到btoa()
,因为它会引发exception: Uncaught DOMException: Failed to execute 'btoa' on 'Window': The string to be encoded contains characters outside of the Latin1 range.
因此,您需要明确地将编码types设置为latin1
,以使您的Node.js Shim与Chrome桌面的编码types相匹配:
const btoaLatin1 = function(str) { return Buffer.from(str, 'latin1').toString('base64'); } const atobLatin1 = function(b64Encoded) {return Buffer.from(b64Encoded, 'base64').toString('latin1');} const btoaUTF8 = function(str) { return Buffer.from(str, 'utf8').toString('base64'); } const atobUTF8 = function(b64Encoded) {return Buffer.from(b64Encoded, 'base64').toString('utf8');} btoaLatin1('✓'); // returns "Ew==" (would be preferable for it to throw error because this is undecodable) atobLatin1(btoa('✓')); // returns "\u0019" (END OF MEDIUM) btoaUTF8('✓'); // returns "4pyT" atobUTF8(btoa('✓')); // returns "✓" // returns "fvXmvA==", just like desktop Chrome btoaLatin1(String.fromCharCode.apply(null, new Uint8Array([0x7e, 0xf5, 0xe6, 0xbc]))); // returns "fsO1w6bCvA==" btoaUTF8(String.fromCharCode.apply(null, new Uint8Array([0x7e, 0xf5, 0xe6, 0xbc])));