436 Stimmen

Node.js wirft den Fehler "btoa ist nicht definiert" aus

In meiner node.js-Anwendung habe ich ein npm install btoa-atob durchgeführt, damit ich die Funktionen btoa() und atob() verwenden konnte, die in clientseitigem Javascript nativ sind, aber aus irgendeinem Grund nicht in Node enthalten waren. Das neue Verzeichnis erschien in meinem node_modules-Ordner, der sich im Stammverzeichnis neben app.js befindet. Dann habe ich dafür gesorgt, dass btoa-atob als Abhängigkeit in meiner package.json-Datei hinzugefügt wird, die sich im Stammverzeichnis befindet.

Dennoch funktioniert es aus irgendeinem Grund immer noch nicht.

console.log(btoa("Hallo Welt!"));

^ sollte "SGVsbG8gV29ybGQh" in der Konsole ausgeben, aber stattdessen erhalte ich den Fehler:

btoa ist nicht definiert.

Habe ich die Installation nicht richtig durchgeführt? Was habe ich übersehen?

12voto

Alexander Punkte 6666

Ich habe einen Code zwischen Server und Client geteilt und ich brauchte eine Implementierung von btoa darin. Ich habe versucht, etwas wie zu machen:

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

aber der Server würde mit dem folgenden Fehler abstürzen:

ReferenceError: btoa is not defined

während Buffer auf dem Client nicht definiert ist.

Ich konnte nicht überprüfen, ob window.btoa definiert ist (es ist ein gemeinsamer Code, erinnerst du dich?)

Also endete ich mit dieser Implementierung:

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

8voto

Saket Kumar Punkte 3583

Ich konnte btoa zur Konvertierung von Binärdaten in eine Bas 64-Zeichenfolge mithilfe des untenstehenden npm-Pakets verwenden: https://www.npmjs.com/package/btoa

Wie in ihrer Dokumentation beschrieben, habe ich folgende Schritte in der Node JS-Anwendung ausgeführt:

  1. Installieren => npm install --save btoa
  2. Deklarieren Sie oben => const btoa = require('btoa');
  3. Verwenden => const b64 = btoa("StringToEncode");

8voto

Rutwick Gangurde Punkte 4434

Jeder, der dekodieren möchte:

let decoded = Buffer.from(, 'base64').toString()

Weil ich hier nach einer Dekodierung gesucht habe, habe ich es schließlich aus einer Antwort hier herausgefunden.

7voto

Luke Taylor Punkte 7267

Hier ist eine prägnante universelle Lösung für die Base64-Codierung:

const nodeBtoa = (b) => Buffer.from(b).toString('base64');
export const base64encode = typeof btoa !== 'undefined' ? btoa : nodeBtoa;

5voto

Shrimpy Punkte 164

Das gleiche Problem tritt auch beim 'script' Plugin im Atom-Editor auf, das eine alte Version von node verwendet und weder btoa() noch atob() unterstützt, noch den Buffer-Datentyp unterstützt. Der folgende Code erledigt das:

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=='));

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X