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 

确保Bufferbtoaatob被加载为全局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])));