Estoy tratando de leer un archivo .json con fs y analizar un objeto JavaScript usando la función JSON.parse().
const json = JSON.parse(fs.readFileSync('./db.json', (err) => { if (err) throw err; })) { "hello": "world" }Pero estoy recibiendo el siguiente error:
undefined:1 { ^ SyntaxError: Token inesperado en JSON en la posición 0
¿Alguien sabe lo que está mal?
readFileSync devuelve un Buffer si no le indica qué codificación usar para convertir el contenido del archivo en texto. Si pasa un Buffer a JSON.parse , se convertirá en una cadena antes de analizarse. El valor predeterminado de toString de Buffer es UTF-8.
Así que hay un par de posibles problemas:
Aparte de eso, readFileSync no acepta una devolución de llamada (devuelve su resultado o arroja un error en su lugar, porque es sincrónico; eso es lo que significa el sufijo Sync en la API de Node.js). (Si tuviera una devolución de llamada, throw err en esa devolución de llamada no tendría sentido. Por ejemplo, no arrojaría un error de la función a la que está llamando a readFileSync ).
Si el archivo no es UTF-8, dígale a readFileSync qué codificación usar (sugiero hacerlo siempre en lugar de depender de la conversión implícita a una cadena más adelante). Si está en (digamos) UTF-16LE ("UTF-16 little endian"), entonces haría esto:
const data = JSON.parse(fs.readFileSync('./db.json', "utf16le")); Si está en UTF-8 con una lista de materiales: el Buffer no elimina la lista de materiales cuando se convierte en cadena, por lo que termina con lo que parece un carácter extraño en la posición 0 que no le gusta a JSON.parse . Si ese es el caso, puedes hacer esto:
const UTF8_BOM = "\u{FEFF}"; let json = fs.readFileSync('./db.json', "utf8"); if (json.startsWith(UTF8_BOM)) { // Remove the BOM json = json.substring(UTF8_BOM.length); } // Parse the JSON const data = JSON.parse(json);