2014-04-16 6 views
84

मेरे node.js एप्लिकेशन में मैंने npm install btoa-atob किया ताकि मैं btoa() और atob() फ़ंक्शंस का उपयोग कर सकूं जो क्लाइंट-साइड जावास्क्रिप्ट में मूल हैं लेकिन किसी कारण से नोड में शामिल नहीं थे। नई निर्देशिका मेरे node_modules फ़ोल्डर में दिखाई दी, जो स्वयं app.js. के साथ रूट में है। फिर मैंने अपने पैकेज.जेसन फ़ाइल में निर्भरता के रूप में btoa-atob को जोड़ना सुनिश्चित किया जो रूट में है।Node.js - "btoa परिभाषित नहीं किया गया है" त्रुटि

हालांकि, किसी कारण से यह अभी भी काम नहीं करेगा।

console.log(btoa("Hello World!")); 

^चाहिए उत्पादन कंसोल के लिए "SGVsbG8gV29ybGQh", लेकिन इसके बजाय मैं त्रुटि मिलती है "btoa defiend नहीं है।"

क्या मैंने ठीक से इंस्टॉल नहीं किया? मैंने क्या अनदेखा किया?

उत्तर

184

'btoa-atob' मॉड्यूल प्रोग्राम प्रोग्रामिक इंटरफ़ेस निर्यात नहीं करता है, यह केवल कमांड लाइन उपयोगिताओं को प्रदान करता है। (एक UTF8 स्ट्रिंग सामग्री आप डिकोडिंग रहे हैं यह सोचते है)

console.log(Buffer.from('Hello World!').toString('base64')); 

रिवर्स:

तुम इतनी बफर का उपयोग कर आप Base64 में बदलने की जरूरत है हो सकता है

console.log(Buffer.from(b64Encoded, 'base64').toString()); 

नोट: नोड v4 से पहले, Buffer.from के बजाय new Buffer का उपयोग करें।

+0

धन्यवाद कि काम किया! – Joey

+17

अगर यह किसी की मदद करता है, तो मैंने इसे अपने mocha में रखा। Commons: '' 'global.btoa = function (str) {वापसी नया बफर (str) .toString ('base64');};' '' ' कंसोल में परीक्षण कर सकते हैं जैसे कि मेरे पास ब्राउजर था। – snapfractalpop

+3

फिर भी node.js और ब्राउज़र के बीच एक और मामूली अंतर जो इसे आइसोमोर्फिज्म प्राप्त करने के लिए थोड़ा और कठिन बनाता है। उत्तर के लिए धन्यवाद, @mscdex, यह वास्तव में मदद की! (ईमानदारी से!) – Swivel

11

रिएक्ट नेटिव और पाउचडीबी के साथ नोड का उपयोग करते समय मेरी टीम इस समस्या में भाग गई।

$ npm install --save buffer 

सुनिश्चित Buffer, btoa, और atob एक वैश्विक रूप में लोड किए गए हैं:: यहाँ हम कैसे इसे हल ...

NPM बफर स्थापित है

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'); 
    }; 
} 
2

मैंने पाया कि हालांकि शिम्स ऊपर दिए गए उत्तरों से, वे 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]))); 

जैसा कि यह पता चला है, Buffer उदाहरण यूटीएफ -8 by default में एन्कोड किए गए तारों का प्रतिनिधित्व/व्याख्या करते हैं। इसके विपरीत, डेस्कटॉप Chrome में, आप इनपुट भी नहीं एक स्ट्रिंग है latin1 के बाहर वर्ण हैं btoa() में, सीमा के रूप में यह एक अपवाद फेंक होगा कर सकते हैं: Uncaught DOMException: Failed to execute 'btoa' on 'Window': The string to be encoded contains characters outside of the Latin1 range.

इसलिए, आप स्पष्ट रूप से latin1 को encoding type में निर्धारित करने की आवश्यकता

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]))); 
3

समाधान यहां पोस्ट गैर- ASCII वर्ण में काम नहीं करते अगर आप Node.js और एक ब्राउज़र के बीच बेस 64 का आदान-प्रदान करने की योजना: अपने Node.js शिम के लिए आदेश डेस्कटॉप क्रोम का एन्कोडिंग प्रकार मैच के लिए। इसे काम करने के लिए आपको इनपुट टेक्स्ट को 'बाइनरी' के रूप में चिह्नित करना होगा।

Buffer.from('Hélló wórld!!', 'binary').toString('base64') 

यह आपको SOlsbPMgd/NybGQhIQ== देता है। यदि आप ब्राउज़र में atob('SOlsbPMgd/NybGQhIQ==') बनाते हैं तो यह इसे सही तरीके से डीकोड करेगा।यह के माध्यम से Node.js में सही भी यह कर देगा:

Buffer.from('SOlsbPMgd/NybGQhIQ==', 'base64').toString('binary') 

आप "बाइनरी हिस्सा" ऐसा नहीं करते हैं, तो आप गलत तरीके से विशेष वर्ण को डिकोड होगा।

मुझे यह मिला from the implementation of the btoa npm package:

संबंधित मुद्दे