নোড.জেস ত্রুটিটি "বিটিওএ সংজ্ঞায়িত করা হয়নি"


230

আমার নোড.জেএস অ্যাপ্লিকেশনটিতে আমি npm install btoa-atobএমনটি করেছি যাতে আমি বটিয়া () এবং অটোব () ফাংশনগুলি ব্যবহার করতে পারি যা ক্লায়েন্ট-সাইড জাভাস্ক্রিপ্টে নেটিভ তবে কোনও কারণে নোডে অন্তর্ভুক্ত ছিল না। নতুন ডিরেক্টরিটি আমার নোড_মডিউলগুলি ফোল্ডারে প্রদর্শিত হয়েছে, যা নিজেই app.js এর সাথে মূলের মধ্যে রয়েছে। তারপরে আমি আমার প্যাকেজ.জসন ফাইলে নির্ভরশীলতা হিসাবে বিটিওএটব যুক্ত করার বিষয়টি নিশ্চিত করেছি যা মূলটি রয়েছে।

যাইহোক, কিছু কারণে, এটি এখনও কাজ করবে না।

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

^ এর "SGVsbG8gV29ybGQh" কনসোলে আউটপুট করা উচিত, তবে পরিবর্তে, আমি ত্রুটি পেয়েছি "btoa সংজ্ঞায়িত নয়।"

আমি কি সঠিকভাবে ইনস্টলটি করিনি? আমি কী উপেক্ষা করেছি?

উত্তর:


537

'Btoa-atob' মডিউলটি কোনও প্রোগ্রাম্যাটিক ইন্টারফেস রফতানি করে না, এটি কেবল কমান্ড লাইন ইউটিলিটি সরবরাহ করে।

আপনার যদি বেস 64 তে রূপান্তর করতে হবে তবে আপনি বাফার ব্যবহার করে এটি করতে পারেন:

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

বিপরীত (আপনি যে সামগ্রীটি ডিকোড করছেন তা ধরে নেওয়া একটি utf8 স্ট্রিং):

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

দ্রষ্টব্য: নোড ভি 4 এর পূর্বে ব্যবহার new Bufferনা করে Buffer.from।


57

এখানে পোস্ট করা সমাধানগুলি অ-এস্কি অক্ষরগুলিতে কাজ করে না (যেমন আপনি যদি নোড.জেএস এবং ব্রাউজারের মধ্যে বেস 64 বিনিময় করার পরিকল্পনা করেন)। এটি কাজ করতে আপনাকে ইনপুট পাঠ্যটিকে 'বাইনারি' হিসাবে চিহ্নিত করতে হবে।

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

এটি আপনাকে দেয় SOlsbPMgd/NybGQhIQ==। আপনি যদি atob('SOlsbPMgd/NybGQhIQ==')কোনও ব্রাউজারে তৈরি করেন তবে এটি সঠিক উপায়ে ডিকোড করবে। এটি ঠিক নোড.জেজেও এর মাধ্যমে এটি করবে:

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

আপনি যদি "বাইনারি অংশ" না করেন তবে আপনি বিশেষ অক্ষরগুলি ভুলভাবে ডিকোড করবেন।

আমি এটি btoa এনপিএম প্যাকেজ বাস্তবায়নের মাধ্যমে পেয়েছি :


1
আপনাকে ধন্যবাদ, আমি পরিবর্তিত চরিত্রগুলি নিয়ে পাগল হয়ে যাচ্ছিলাম।
— ম্যাথু জেমস ব্রিগস 21

1
আপনাকে ধন্যবাদ ইভান, আমি এতে কয়েক ঘন্টা সময় দিতাম ... আপনার উত্তরটি গ্রহণযোগ্য হওয়া উচিত!
— পাভেল

আইভেন আলেগ্রি কেবল 'বাইনারি' এনকোডিং ব্যবহার করবেন না। যদি আপনি এটি করেন Buffer.from('Hélló wórld!!').toString('base64')- এটি আপনাকে দেয় SOlsbPMgd/NybGQhIQ==যা অ-এস্কি স্ট্রিংয়ে সঠিকভাবে রূপান্তরিত হতে পারে।
— টোটালএএমডি

1
@ টোটালএএমডি এটি নোড.জেএস থেকে ব্রাউজার বা বিপরীত দিকে বেস 64 বিনিময় করতে কাজ করবে না
— আইভান আলেগ্রে

3
আপনি বেস 64 তে এনকোডিং তুলনা করছেন এবং এটি একই প্ল্যাটফর্মে ডিকোড করছেন। ক্রোম থেকে ক্রোম এবং নোড থেকে নোড। আপনি যদি বাইনারি ছাড়াই নোড 10 এ এনকোড করেন তবে এটি দেবে SMOpbGzDsyB3w7NybGQhIQ==। আপনি যদি এটি ব্রাউজারে ডিকোড করেন তবে এটি আপনাকে দেবে Hélló wórld!!। বাইনারি ক্রস প্ল্যাটফর্মের সামঞ্জস্যতা নিশ্চিত করার জন্য উপযুক্ত।
— ইভান আলেগ্রে

22

প্রতিক্রিয়া নেটিভ এবং পাউচডিবি সহ নোড ব্যবহার করার সময় আমার দল এই সমস্যায় পড়েছিল। এখানে আমরা কীভাবে এটি সমাধান করেছি ...

এনপিএম ইনস্টল বাফার:

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

2
আপনার কোডে নতুন বাফার () কমান্ডটি নোডের নতুন সংস্করণগুলিতে নিম্নলিখিত ত্রুটিটি দেয়: [DEP0005] অবমানন সতর্কতা: বাফার () সুরক্ষা এবং ব্যবহারযোগ্যতার সমস্যার কারণে অবচিত করা হয়েছে। পরিবর্তে বাফার.অলোক (), বাফার.এলোকউনস্যাফ (), বা বাফার.ফ্রাম () পদ্ধতিগুলি ব্যবহার করুন।
— রডরিগো দে আলমেডা সিকিরা

8

আমি দেখেছি যে উপরের উত্তরগুলি থেকে শিমগুলি কাজ করেছে, তারা ডেস্কটপ ব্রাউজারগুলির 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 এ ডিফল্টরূপে এনকোড করা স্ট্রিংগুলি উপস্থাপন / ব্যাখ্যা করে । বিপরীতে, ডেস্কটপ ক্রোমে, আপনি এমন একটি স্ট্রিংও ইনপুট করতে পারবেন না যাতে এতে ল্যাটিন 1 ব্যাপ্তির বাইরে অক্ষর রয়েছে btoa(), কারণ এটি একটি ব্যতিক্রম ছুঁড়ে দেবে:Uncaught DOMException: Failed to execute 'btoa' on 'Window': The string to be encoded contains characters outside of the Latin1 range.

অতএব, আপনি স্পষ্টভাবে সেট করতে হবে এনকোডিং টাইপ করার latin1ডেস্কটপ Chrome এর এনকোডিং টাইপ মেলে shim আপনার Node.js জন্য অনুক্রমে:

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

নোড v0.12.2 এ একটি বাফার.ফর্ম ফাংশন নেই
— জিব্রি

@ জিব্রি নোড v0.12.2 প্রাচীন এবং দুই বছর আগে জীবনের শেষের দিকে পৌঁছেছে । Buffer.from()হয় প্রস্তাবিত উপায় নিরাপত্তা কারণে বাফার API- টি ব্যবহার করার (যদিও যে লিঙ্ক বিকল্প নির্মল হবে Buffer.from()যে নোড v0.12.2 জন্য প্রযোজ্য হতে পারে)।
— জেমি বার্চ

আমি এটি বুঝতে পারি, তবে এম্বেড থাকা ডিভাইসে আমার সেই সংস্করণটি রয়েছে।
— জিব্রি

আমি এথিতে আমার কোডটি চালাচ্ছি স্ক্রিপ্ট প্যাকেজ github.com/rgbkrk/atom-script ব্যবহার করে যা নোডের পুরানো বাস্তবায়ন। অন্য কথায়, এটিতেও বিটিওএর জন্য একটি বাস্তবায়ন প্রয়োজন, যখন এটি বাফার.ফ্রোম () এর সাথে লড়াই করতে পারে না।
— চিংড়ি

4

আমার সার্ভার এবং ক্লায়েন্টের মধ্যে একটি কোড ভাগ করা আছে এবং এর ভিতরে আমার বিটিওএর প্রয়োগ প্রয়োজন। আমি এরকম কিছু করার চেষ্টা করেছি:

const btoaImplementation =  btoa || (str => Buffer.from(str).toString('base64'));

তবে সার্ভার এর সাথে ক্রাশ করবে:

রেফারেন্সএরর: বিটিওএ সংজ্ঞায়িত করা হয়নি

যখন Bufferক্লায়েন্ট উপর সংজ্ঞায়িত করা হয় না।

আমি উইন্ডো বিটিওএ পরীক্ষা করতে পারিনি (এটি একটি ভাগ করা কোড, মনে আছে?)

সুতরাং আমি এই বাস্তবায়ন দিয়ে শেষ করেছি:

const btoaImplementation = str => {
    try {
        return btoa(str);
    } catch(err) {
        return Buffer.from(str).toString('base64')
    }
};

1

আমি বুঝতে পারি এটি নোড অ্যাপ্লিকেশনটির জন্য আলোচনার বিষয়, তবে নোড সার্ভারে চলমান সর্বজনীন জাভাস্ক্রিপ্ট অ্যাপ্লিকেশনগুলির স্বার্থে, এই পোস্টে আমি কীভাবে এলাম, আমি সর্বজনীন / আইসোমরফিক রিঅ্যাক্ট অ্যাপটির জন্য এটি গবেষণা করে চলেছি বিল্ডিং, এবং প্যাকেজটি ababআমার জন্য কাজ করেছিল। আসলে এটিই কেবলমাত্র সমাধান ছিল যা আমি কাজ করে দেখতে পেলাম, বাফার পদ্ধতিটি ব্যবহার করার পরিবর্তে এটিও উল্লেখ করা হয়েছিল (আমার টাইপস্ক্রিপ্ট সমস্যা ছিল)।

(এই প্যাকেজটি ব্যবহার করে jsdom, যা ঘুরেফিরে ব্যবহার করেwindow প্যাকেজটি ))

আমার বক্তব্য ফিরে পেতে; এর উপর ভিত্তি করে, সম্ভবত যদি এই কার্যকারিতাটি ইতিমধ্যে আপনার উল্লিখিত একটি এনপিএম প্যাকেজ হিসাবে লেখা থাকে এবং এটি ডাব্লু 3 স্পেকের ভিত্তিতে নিজস্ব অ্যালগরিদম থাকে তবে আপনি এটি ইনস্টল করে ব্যবহার করতে পারেনabab আপনি নিজের ফাংশনটি লেখার চেয়ে প্যাকেজটি যা হতে পারে বা নাও হতে পারে এনকোডিংয়ের উপর ভিত্তি করে নির্ভুল।

--- সম্পাদনা ---

প্যাকেজ সহ এনকোডিং (কেন এটি এখন হতে শুরু করেছে তা নিশ্চিত নয়) নিয়ে আজ আমি আজব বিষয়গুলি শুরু করেছি abab। এটি বেশিরভাগ সময় সঠিকভাবে এনকোড করে বলে মনে হয় তবে কখনও কখনও সম্মুখ প্রান্তে এটি ভুলভাবে এনকোড করে। ডিবাগ করার চেষ্টা করে দীর্ঘ সময় ব্যয় করেছেন, তবে base-64সুপারিশ অনুসারে প্যাকেজটিতে স্যুইচ করেছেন এবং এটি সরাসরি চলে গেল। অবশ্যই বেস 64 এর অ্যালগরিদমের নীচে রয়েছে বলে মনে হচ্ছে abab।


1

এটিম সম্পাদকটিতে 'স্ক্রিপ্ট' প্লাগইনটিতে একই সমস্যা, যা নোডের পুরাতন সংস্করণ, যার মধ্যে বিটিও (), না এটোব () নেই, বা এটি বাফার ডেটাটাইপ সমর্থন করে না। নিম্নলিখিত কোডটি কৌশলটি করে:

var Base64 = new function() {
  var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
  this.encode = function(input) {
    var output = "";
    var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
    var i = 0;
    input = Base64._utf8_encode(input);
    while (i < input.length) {
      chr1 = input.charCodeAt(i++);
      chr2 = input.charCodeAt(i++);
      chr3 = input.charCodeAt(i++);
      enc1 = chr1 >> 2;
      enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
      enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
      enc4 = chr3 & 63;
      if (isNaN(chr2)) {
        enc3 = enc4 = 64;
      } else if (isNaN(chr3)) {
        enc4 = 64;
      }
      output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2) + keyStr.charAt(enc3) + keyStr.charAt(enc4);
    }
    return output;
  }

  this.decode = function(input) {
    var output = "";
    var chr1, chr2, chr3;
    var enc1, enc2, enc3, enc4;
    var i = 0;
    input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
    while (i < input.length) {
      enc1 = keyStr.indexOf(input.charAt(i++));
      enc2 = keyStr.indexOf(input.charAt(i++));
      enc3 = keyStr.indexOf(input.charAt(i++));
      enc4 = keyStr.indexOf(input.charAt(i++));
      chr1 = (enc1 << 2) | (enc2 >> 4);
      chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
      chr3 = ((enc3 & 3) << 6) | enc4;
      output = output + String.fromCharCode(chr1);
      if (enc3 != 64) {
        output = output + String.fromCharCode(chr2);
      }
      if (enc4 != 64) {
        output = output + String.fromCharCode(chr3);
      }
    }
    output = Base64._utf8_decode(output);
    return output;
  }

  this._utf8_encode = function(string) {
    string = string.replace(/\r\n/g, "\n");
    var utftext = "";
    for (var n = 0; n < string.length; n++) {
      var c = string.charCodeAt(n);
      if (c < 128) {
        utftext += String.fromCharCode(c);
      } else if ((c > 127) && (c < 2048)) {
        utftext += String.fromCharCode((c >> 6) | 192);
        utftext += String.fromCharCode((c & 63) | 128);
      } else {
        utftext += String.fromCharCode((c >> 12) | 224);
        utftext += String.fromCharCode(((c >> 6) & 63) | 128);
        utftext += String.fromCharCode((c & 63) | 128);
      }
    }
    return utftext;
  }

  this._utf8_decode = function(utftext) {
    var string = "";
    var i = 0;
    var c = 0,
      c1 = 0,
      c2 = 0,
      c3 = 0;
    while (i < utftext.length) {
      c = utftext.charCodeAt(i);
      if (c < 128) {
        string += String.fromCharCode(c);
        i++;
      } else if ((c > 191) && (c < 224)) {
        c2 = utftext.charCodeAt(i + 1);
        string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
        i += 2;
      } else {
        c2 = utftext.charCodeAt(i + 1);
        c3 = utftext.charCodeAt(i + 2);
        string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
        i += 3;
      }
    }
    return string;
  }
}()

var btoa = Base64.encode;
var atob = Base64.decode;

console.log("btoa('A') = " + btoa('A'));
console.log("btoa('QQ==') = " + atob('QQ=='));
console.log("btoa('B') = " + btoa('B'));
console.log("btoa('Qg==') = " + atob('Qg=='));


এটি ধন্যবাদ ধন্যবাদ। আমার ক্ষেত্রে, আমি চক্রআংগাইন ব্যবহার করছি যা এটোব সমর্থন করে না বলে মনে হচ্ছে।
— জল


0
export const universalBtoa = str => {
  try {
    return btoa(str);
  } catch (err) {
    return Buffer.from(str).toString('base64');
  }
};

export const universalAtob = b64Encoded => {
  try {
    return atob(b64Encoded);
  } catch (err) {
    return Buffer.from(b64Encoded, 'base64').toString();
  }
};

0

বেস 64 এনকোডিংয়ের জন্য এখানে একটি সংক্ষিপ্ত সার্বজনীন সমাধান রয়েছে:

const nodeBtoa = (b) => Buffer.from(b).toString('base64');
export const base64encode = typeof btoa !== 'undefined' ? btoa : nodeBtoa;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.