Leer y escribir YAML en un archivo en Node.js / JavaScript

    Introducci贸n

    En los 煤ltimos a帽os, YAML, que significa YAML Ain’t Markup Language, se ha vuelto muy popular para su uso en el almacenamiento de datos de manera serializada, generalmente archivos de configuraci贸n. Dado que YAML es esencialmente un formato de datos, la especificaci贸n YAML es bastante breve. Por lo tanto, la 煤nica funcionalidad requerida de las bibliotecas YAML es la capacidad de analizar o generar archivos con formato YAML.

    En este art铆culo, veremos c贸mo puede utilizar YAML con una aplicaci贸n Node.js. Comenzaremos viendo c贸mo se almacenan los datos en un archivo YAML, y luego cargaremos esos datos en un objeto JavaScript. Por 煤ltimo, aprenderemos c贸mo almacenar un objeto JavaScript en un archivo YAML.

    Hay algunas bibliotecas de node populares que se utilizan para analizar y generar YAML: yaml y js-yaml. js-yaml es la m谩s popular de las dos bibliotecas, por lo que nos centraremos en este art铆culo.

    Antes de seguir adelante, existen algunos requisitos previos para este tutorial. Debe tener un conocimiento b谩sico de la sintaxis de JavaScript, espec铆ficamente para el tiempo de ejecuci贸n de Node.js. Tambi茅n querr谩 tener Node.js y NPM instalados en su sistema para seguir adelante. Aparte de eso, el tutorial es bastante simple y f谩cil de seguir para principiantes.

    Instalaci贸n

    Como con cualquier paquete de Node, la instalaci贸n es bastante simple usando NPM:

    $ npm install js-yaml
    

    Solo aseg煤rese de usar los indicadores correctos para guardar la dependencia en su archivo package.json. Por ejemplo, si js-yaml solo se usa con fines de desarrollo, luego use --save-dev, de lo contrario use --save si se usa en el entorno de producci贸n de su aplicaci贸n.

    Puede verificar que est茅 instalado correctamente abriendo el REPL desde el mismo directorio e importando el paquete con lo siguiente:

    $ node
    > const yaml = require('js-yaml')
    >
    

    los js-yaml La biblioteca tambi茅n admite el uso de CLI, lo que le permite inspeccionar archivos YAML desde la l铆nea de comandos. Puede habilitar esto instalando el paquete globalmente:

    $ npm install -g js-yaml
    

    Leyendo archivos YAML en Node.js

    Comenzaremos leyendo un archivo con formato YAML y analiz谩ndolo en un objeto JS. Por el bien de este tutorial, digamos que tenemos un archivo, data.yaml, que tiene el siguiente contenido:

    --- # Article data
      title: "Reading and Writing YAML to a File in Node.js/JavaScript"
      url path: "/reading-and-writing-yaml-to-a-file-in-node-js-javascript"
      domain: "Pharos.sh.com"
      port: 443
      is-https: true
      meta:
        published-at: "Nov. 1st, 2019"
        author:
          name: "Scott Robinson"
          contact: "[email聽protected]"
        tags:
          - javascript
          - node.js
          - web development
    

    Para leer y analizar este archivo, usaremos el .safeLoad() m茅todo:

    // read.js
    const fs = require('fs');
    const yaml = require('js-yaml');
    
    try {
        let fileContents = fs.readFileSync('./data.yaml', 'utf8');
        let data = yaml.safeLoad(fileContents);
    
        console.log(data);
    } catch (e) {
        console.log(e);
    }
    

    La ejecuci贸n de este c贸digo generar谩 lo siguiente:

    $ node read.js
    { title: 'Reading and Writing YAML to a File in Node.js/JavaScript',
      'url path': '/reading-and-writing-yaml-to-a-file-in-node-js-javascript',
      domain: 'Pharos.sh.com',
      port: 443,
      'is-https': true,
      meta:
       { 'published-at': 'Nov. 1st, 2019',
         author: { name: 'Scott Robinson', contact: '[email聽protected]' },
         tags: [ 'javascript', 'node.js', 'web development' ] } }
    

    Puede ver que los datos del archivo YAML ahora se convierten en objetos y literales JS en la misma estructura que el archivo.

    los .safeLoad() Se recomienda el m茅todo para analizar contenido YAML, ya que es seguro para datos que no son de confianza. Una limitaci贸n que vale la pena se帽alar es que este m茅todo no admite fuentes de varios documentos. Si est谩 familiarizado con YAML, sabr谩 que YAML puede contener varios “documentos” dentro de un solo archivo, que est谩n separados por el --- sintaxis. Por ejemplo:

    --- # Programming language
      language: "JavaScript"
      created-at: "December 4, 1995"
      domain: "Pharos.sh.com"
      creator: "Brendan Eich"
    --- # Website
      domain: "wikipedia.org"
      created-at: "January 15, 2001"
      num-languages: 304
      num-articles: 51360771
      creator:
        - Jimmy Wales
        - Larry Sanger
    

    Cargando este archivo con .safeLoad() lanzar谩 una excepci贸n. En su lugar, debe utilizar el .safeLoadAll() m茅todo, as铆:

    // read-all.js
    const fs = require('fs');
    const yaml = require('js-yaml');
    
    try {
        let fileContents = fs.readFileSync('./data-multi.yaml', 'utf8');
        let data = yaml.safeLoadAll(fileContents);
    
        console.log(data);
    } catch (e) {
        console.log(e);
    }
    

    Esto da como resultado una matriz de documentos YAML analizados:

    $ node read-all.js
    [ { language: 'JavaScript',
        'created-at': 'December 4, 1995',
        domain: 'Pharos.sh.com',
        creator: 'Brendan Eich' },
      { domain: 'wikipedia.org',
        'created-at': 'January 15, 2001',
        'num-languages': 304,
        'num-articles': 51360771,
        creator: [ 'Jimmy Wales', 'Larry Sanger' ] } ]
    

    Otro m茅todo que vale la pena mencionar es el .load() m茅todo, que es muy similar a .safeLoad(), excepto que es compatible con todos Tipos de esquema YAML. Los tipos adicionales admitidos son espec铆ficos de JavaScript (!!js/undefined, !!js/regexpy !!js/function) y debe confiar absolutamente en los datos de estos archivos YAML, ya que pueden cargar c贸digo que no es de confianza.

    Por ejemplo, una funci贸n se puede definir en YAML como la siguiente:

    'toString': !<tag:yaml.org,2002:js/function> function() {console.log('Malicious code execuited!');}
    

    Esa etiqueta le dice a nuestra biblioteca YAML que la analice como una funci贸n, que luego se puede ejecutar m谩s tarde. Como se se帽ala en la documentaci贸n, un m茅todo com煤n que se ejecuta en objetos JS es toString, que podemos explotar as铆:

    // unsafe.js
    const yaml = require('js-yaml');
    
    let yamlStr = "'toString': !<tag:yaml.org,2002:js/function> function() {console.log('Malicious code execuited!');}";
    let loadedYaml = yaml.load(yamlStr) + '';
    console.log(loadedYaml);
    

    Y ejecutar este c贸digo muestra que el console.log de hecho se ejecuta el m茅todo:

    $ node unsafe.js 
    Malicious code execuited!
    undefined
    

    Escribir YAML en archivos en Node.js

    Ahora que sabe c贸mo leer archivos YAML con Node.js, veamos c贸mo podemos escribir objetos / datos JavaScript en un archivo YAML.

    Para este ejemplo, usaremos el siguiente objeto JS, que puede reconocer de los ejemplos anteriores:

    let data = {
        title: 'Reading and Writing YAML to a File in Node.js/JavaScript',
        'url path': '/reading-and-writing-yaml-to-a-file-in-node-js-javascript',
        domain: 'Pharos.sh.com',
        port: 443,
        'is-https': true,
        meta: {
            'published-at': 'Nov. 1st, 2019',
            author: {
                name: 'Scott Robinson',
                contact: '[email聽protected]'
            },
            tags: [
                'javascript', 'node.js', 'web development'
            ]
        }
    };
    

    Para serializar este objeto y guardarlo en un archivo con formato YAML, usaremos el .safeDump() m茅todo, que nuevamente usa js-yamles DEFAULT_SAFE_SCHEMA:

    // write.js
    const fs = require('fs');
    const yaml = require('js-yaml');
    
    let data = { /* Same as above */};
    
    let yamlStr = yaml.safeDump(data);
    fs.writeFileSync('data-out.yaml', yamlStr, 'utf8');
    

    Al ejecutar este c贸digo, se escribir谩 un archivo YAML que se ve as铆:

    title: Reading and Writing YAML to a File in Node.js/JavaScript
    url path: /reading-and-writing-yaml-to-a-file-in-node-js-javascript
    domain: Pharos.sh.com
    port: 443
    is-https: true
    meta:
      published-at: 'Nov. 1st, 2019'
      author:
        name: Scott Robinson
        contact: [email聽protected]
      tags:
        - javascript
        - node.js
        - web development
    

    Esta salida es casi id茅ntica al YAML original que le铆mos anteriormente en el art铆culo, excepto que el separador de documentos (---) no esta incluido.

    Tipos de datos

    Es importante tener en cuenta que no todos los tipos de datos de JavaScript se pueden serializar directamente en YAML y viceversa. En algunos casos, se utilizar谩 el tipo de datos m谩s cercano cuando sea posible si no se admite directamente. Por ejemplo, un YAML !!seq type se analizar谩 como una matriz de JavaScript.

    De acuerdo con la documentaci贸n js-yaml, se admiten los siguientes tipos de datos:

    Ejemplo de tipo YAML Tipo JS

    !!nulo''nulo
    !! booltruebool
    !!En t3n煤mero
    !!flotador3.1415n煤mero
    !!binarioc3RhY2thYnVzZS5jb20=buffer
    !! marca de tiempo'2013-08-15'fecha
    !! omap[ ... ]matriz de pares clave-valor
    !! pares[ ... ]matriz o pares de matriz
    !!conjunto{ ... }matriz de objetos con claves dadas y valores nulos
    !! str'...'String
    !! seq[ ... ]formaci贸n
    !!mapa{ ... }objeto

    Como se mencion贸 anteriormente, tambi茅n se pueden admitir otros tipos espec铆ficos de JS, pero solo si no est谩 utilizando los m茅todos “seguros”.

    Conclusi贸n

    YAML es un formato cada vez m谩s popular que se usa para estructurar datos para aplicaciones, generalmente como archivos de configuraci贸n, pero tambi茅n como reemplazo de cualquier cosa para la que se usa JSON. Debido a su alta flexibilidad y sintaxis f谩cil de leer, est谩 reemplazando r谩pidamente a JSON en muchos proyectos, aunque ambos todav铆a tienen su lugar.

    En este art铆culo mostramos c贸mo puede utilizar el js-yaml biblioteca para analizar archivos YAML en objetos JavaScript en Node.js y c贸mo se pueden serializar objetos JavaScript en un archivo YAML. Tambi茅n mostramos qu茅 tipos de JS se utilizan para varios tipos de datos YAML. Para obtener m谩s detalles sobre esta biblioteca, consulte la documentaci贸n oficial.

    .

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *