En mi node.js la aplicación me hizo un npm install btoa-atob para que yo pudiera usar el btoa() y atob() funciones que son nativos en el lado del cliente con javascript, pero por alguna razón no fueron incluidos en el nodo. El nuevo directorio se presentó en mi carpeta node_modules, que sí que está en la raíz junto a app.js. Luego me hizo asegúrese de agregar btoa-atob como una dependencia en mi paquete.archivo json que está en la raíz.

Sin embargo, por alguna razón que todavía no funcionan.

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

^ debe de salida «SGVsbG8gV29ybGQh» a la consola, pero en vez de eso me sale el error «btoa no se defiend.»

No me lo instale correctamente? ¿Qué me dan?

InformationsquelleAutor Joey | 2014-04-16

6 Comentarios

  1. 433

    El ‘btoa-atob’ módulo no exportar una interfaz de programación, sólo proporciona utilidades de línea de comandos.

    Si usted necesita para convertir a Base64, puede hacerlo utilizando el Búfer:

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

    Inversa (suponiendo que el contenido de la decodificación es un utf8 string):

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

    Nota: antes de Nodo v4, uso new Buffer en lugar de Buffer.from.

  2. 37

    Las soluciones publicadas aquí no funcionan en caracteres no ascii (es decir, si el plan para el intercambio de base64 entre Node.js y un navegador). Con el fin de hacer que funcione, usted tiene que marcar el texto de entrada como «binarios».

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

    Esto le da SOlsbPMgd/NybGQhIQ==. Si usted hace atob('SOlsbPMgd/NybGQhIQ==') en un navegador se descifrará en el camino correcto. Lo hará a la derecha también en Node.js a través de:

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

    Si usted no hace los «binarios parte», le decodificar erróneamente los caracteres especiales.

    Lo tengo a partir de la implementación de la btoa mecanismo nacional de prevención de paquete:

    • gracias, me estaba volviendo loco con la modificación de los caracteres.
    • Gracias Ivan, me habría pasado horas en este … que la respuesta debe ser aceptado!
    • Iván Alegre Simplemente no usar ‘binario’ codificación. Si usted Buffer.from('Hélló wórld!!').toString('base64') — le dará SOlsbPMgd/NybGQhIQ== que pueden ser convertidos en no-ascii cadena de nuevo correctamente.
    • no funciona el intercambio de base64 de Node.js para navegador o viceversa
    • Sólo verificado) En Chrome 75: atob(btoa("Hélló wórld!!")) === "Hélló wórld!!" b) En el Nodo 10: Buffer.from('Hélló wórld!!').toString('base64') === 'SMOpbGzDsyB3w7NybGQhIQ==' y Buffer.from('SMOpbGzDsyB3w7NybGQhIQ==', 'base64').toString() === 'Hélló wórld!!' c) del Nodo Buffer.from() puede leer incluso si se quita tirados,’=’, pero siempre se puede escribir en función simple para completar la cadena codificada con espacios ‘=’.
    • Usted está comparando la codificación en base64 y decodificación en la misma plataforma. Chrome Chrome y el Nodo a Nodo. Si se codifican en el Nodo 10 sin binario, se le dará SMOpbGzDsyB3w7NybGQhIQ==. Si usted decodificar esta en un navegador, se le dará Hélló wórld!!. El binario es perfecto para garantizar la compatibilidad de plataforma.
    • Su respuesta en una función: function btoa(str){return Buffer.from(str, 'binary').toString('base64');} function atob(str){return Buffer.from(str, 'base64').toString('binary');}

  3. 19

    Mi equipo se topó con este problema cuando se utiliza el Nodo con Reaccionar Nativo y PouchDB. Aquí es cómo solucionamos esto…

    NPM install búfer:

    $ npm install --save buffer

    Garantizar Buffer, btoa, y atob se cargan como un globals:

    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');
      };
    }
    • El comando nuevo Buffer() en el código da el siguiente error en las versiones más recientes de nodo: [DEP0005] DeprecationWarning: Buffer() está en desuso debido a la seguridad y los problemas de usabilidad. Por favor, usar el Buffer.alloc(), de Búfer.allocUnsafe(), o Buffer.a partir de() métodos en su lugar.
  4. 8

    He encontrado que a pesar de las cuñas de las respuestas anteriormente trabajado, que no coinciden con el comportamiento de los navegadores de escritorio’ implementaciones de btoa() y 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])));

    Resulta Buffer instancias representan/interpretar cadenas codificadas en UTF-8 por defecto. Por el contrario, en el escritorio de Chrome, ni siquiera se puede introducir una cadena que contiene caracteres fuera de la latin1 gama en btoa(), como se lanzaría una excepción: Uncaught DOMException: Failed to execute 'btoa' on 'Window': The string to be encoded contains characters outside of the Latin1 range.

    Por lo tanto, usted necesita para establecer explícitamente la tipo de codificación a latin1 para que su Node.js calza para que coincida con el tipo de codificación de escritorio de Chrome:

    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])));
    • en el nodo v0.12.2 no hay un Búfer.de la función
    • Nodo v0.12.2 es antigua y alcanzado el fin de su vida hace dos años. Buffer.from() es el forma recomendada para usar el Buffer de la API, debido a razones de seguridad (a pesar de que el enlace será aclarar alternativas para Buffer.from() que se pueden aplicar para el Nodo v0.12.2).
    • Entiendo eso, pero en un dispositivo embebido tengo esa versión.
  5. 1

    Entiendo que esto es un punto de discusión para un nodo de la aplicación, pero en el interés universal de aplicaciones JavaScript que se ejecuta en un nodo de servidor, que es cómo llegué a este post, he estado investigando esto para un universal /isomorfo reaccionar aplicación que ha sido la construcción, y el paquete de abab trabajó para mí. De hecho, era la única solución que pude encontrar que trabajó, en lugar de utilizar el método de Buffer también se menciona (tuve manuscrito problemas).

    (Este paquete es utilizado por jsdom, que a su vez es utilizado por el window paquete.)

    Volviendo a mi punto; sobre esta base, tal vez si esta funcionalidad ya está escrito como un mecanismo nacional de prevención de paquete como el que usted ha mencionado, y tiene su propio algoritmo basado en W3 spec, usted puede instalar y usar el abab paquete en lugar de escribir propia de la función que pueden o no ser correctas basadas en la codificación.

    EDITAR

    Empecé a tener extraños problemas de hoy con la codificación (no sé por qué se inicia sucediendo ahora) con el paquete abab. Parece codificar correctamente la mayoría del tiempo, pero a veces en extremo delantero se codifica de forma incorrecta. Pasó un largo tiempo tratando de depurar, pero cambió a paquete de base-64 como se recomienda, y funcionó de inmediato. Definitivamente parecía ser el algoritmo base64 de abab.

  6. 0

    He un código compartido entre el servidor y el cliente y necesitaba una aplicación de btoa en su interior.
    He intentado hacer algo como:

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

    pero el Servidor aplastaría con:

    ReferenceError: btoa no está definido

    mientras Buffer no está definido en el cliente.

    No podía ventana de verificación.btoa (es un código compartido, ¿recuerdas?)

    Así que terminé con esta aplicación:

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

Dejar respuesta

Please enter your comment!
Please enter your name here