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?
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
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 __dirname
que 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 creofs.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 usandonode
.–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
¿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