JSON.parse(fs.readFileSync()) devolviendo un búfer – cadena de números

3 minutos de lectura

Avatar de usuario de Conrad Scherb
Conrado Scherb

Estoy usando un Node.js simple para extraer información de un archivo json válido (comprobado con JSLint), pero el código que estoy usando no devuelve el valor esperado:

        squadJSON = JSON.parse(fs.readFileSync('./squads/squad' + whichSquad + '.json'));    

y devuelve:

{ type: 'Buffer', data: 
[ 123,
 10,
 32,
 32,
 34,
 97,
 99,
 ... 548 more items ] }

¿Alguna razón de por qué sucede esto?

  • ¿Cuál es el valor esperado?

    –Spencer Wieczorek

    16 de febrero de 2018 a las 0:28


  • No. JSON.parse nunca devuelve un búfer.

    – Bergi

    16 de febrero de 2018 a las 0:52

fs.readFileSync() devuelve un búfer si no especifica una codificación.

https://nodejs.org/api/fs.html#fs_fs_readfilesync_path_options

Así que dígame fs.readFileSync() qué codificación usar:

squadJSON = JSON.parse(fs.readFileSync('./squads/squad' + whichSquad + '.json', 'utf8')); 

  • ¡Sí! Pasar un valor al segundo parámetro hará el truco así: fs.readFileSync('/path/to/file.json', 'utf8'). Gracias mucho.

    –Abel Callejo

    25 de enero de 2022 a las 3:05

Avatar de usuario de Patrick Roberts
patricio roberts

El “por qué” ha sido respondido por Sidney, pero un mejor “qué hacer” sería usar require()que apoya analizando archivos JSON válidos sincrónicamente y devolviendo el resultado como un objeto:

squadJSON = require('./squads/squad' + whichSquad + '.json');

o incluso mejor, usando un ES6 literal de plantilla:

squadJSON = require(`./squads/squad${whichSquad}.json`);

Una diferencia notable usando require() es que resuelve caminos relativos desde __dirnameque es la ruta del directorio del módulo actual, mientras que fs métodos resuelven rutas relativas usando process.cwd(), o “directorio de trabajo actual”. Es el directorio dentro de una sesión de shell desde el cual node ejecuta el módulo principal del programa.

Con suerte, los ejemplos a continuación demuestran cómo difiere su resolución de ruta relativa:

Para hacer require(...) comportarse como JSON.parse(fs.readFileSync(..., 'utf8')):

const { resolve } = require('path');

function readFileSyncJson (path) {
  return require(resolve(process.cwd(), path));
}

y para hacer JSON.parse(fs.readFileSync(..., 'utf8')) comportarse como require(...):

const { resolve } = require('path');

function requireJson (path) {
  return JSON.parse(fs.readFileSync(resolve(__dirname, path), 'utf8'));
}

  • Muy cierto, require es mucho más conveniente para leer archivos JSON. También, require siempre se resuelve en relación con el archivo en el que se llama, mientras que creo fs.readFileSync resuelve según el directorio de trabajo actual (a menos que lo resuelva específicamente usando __dirname).

    – Sídney

    16 de febrero de 2018 a las 0:44

  • Lo siento, pero me devuelve exactamente lo mismo, ya sea que use Require o especifique la codificación… @sidney

    – Conrado Scherb

    16 de febrero de 2018 a las 0:46

  • @ConradScherb ese puede ser el caso a menudo, lo que significa que el módulo require() se llama desde está en el mismo directorio que (o es) el archivo que invocaste usando node.

    –Patrick Roberts

    16 de febrero de 2018 a las 0:49


  • @PatrickRoberts, entonces, en ese caso, ¿cuál sería la solución?

    – Conrado Scherb

    16 de febrero de 2018 a las 0:50

  • @ConradScherb Agregué ejemplos para aclarar sus diferencias. En primer lugar, no hay problema, la información solo está ahí para que esté al tanto de los matices.

    –Patrick Roberts

    16 de febrero de 2018 a las 0:57

¿Ha sido útil esta solución?