JSON.parse(fs.readFileSync()) gibt einen Puffer zurück – eine Zahlenfolge

Lesezeit: 2 Minuten

Benutzeravatar von Conrad Scherb
Konrad Scherb

Ich verwende ein einfaches Node.js, um Informationen aus einer gültigen JSON-Datei abzurufen (überprüft mit JSLint), aber der Code, den ich verwende, gibt nicht den erwarteten Wert zurück:

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

und es kommt zurück:

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

Gibt es einen Grund, warum das passiert?

  • Was ist der erwartete Wert?

    – Spencer Wieczorek

    16. Februar 2018 um 0:28


  • NEIN. JSON.parse gibt niemals einen Puffer zurück.

    – Bergi

    16. Februar 2018 um 0:52

fs.readFileSync() gibt einen Puffer zurück, wenn Sie keine Kodierung angeben.

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

Also erzähl fs.readFileSync() Welche Codierung soll verwendet werden:

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

  • Jawohl! Die Übergabe eines Werts an den 2. Parameter führt folgendermaßen aus: fs.readFileSync('/path/to/file.json', 'utf8'). Danke soviel.

    – Abel Callejo

    25. Januar 2022 um 3:05

Benutzeravatar von Patrick Roberts
Patrick Roberts

Das „Warum“ wurde von Sidney beantwortet, aber ein besseres „Was ist zu tun“ wäre zu verwenden require()was unterstützt Parsen gültiger JSON-Dateien synchron und Rückgabe des Ergebnisses als Objekt:

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

oder noch schöner, mit einem ES6 Vorlagenliteral:

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

Ein bemerkenswerter Unterschied bei der Verwendung require() ist, dass es relative Pfade auflöst __dirnamedas ist der Verzeichnispfad des aktuellen Moduls, wohingegen fs Methoden lösen relative Pfade auf verwenden process.cwd()oder „aktuelles Arbeitsverzeichnis“. Es ist das Verzeichnis innerhalb einer Shell-Sitzung, von dem aus das Hauptmodul des Programms vom Knoten ausgeführt wird.

Hoffentlich zeigen die folgenden Beispiele, wie sich ihre relative Pfadauflösung unterscheidet:

Zu machen require(...) Benehmen wie JSON.parse(fs.readFileSync(..., 'utf8')):

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

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

Und zu machen JSON.parse(fs.readFileSync(..., 'utf8')) Benehmen wie require(...):

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

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

  • Sehr richtig, require ist viel bequemer zum Lesen von JSON-Dateien. Auch, require wird meiner Meinung nach immer relativ zu der Datei aufgelöst, in der es aufgerufen wird fs.readFileSync wird basierend auf dem aktuellen Arbeitsverzeichnis aufgelöst (es sei denn, Sie lösen dies ausdrücklich mithilfe von auf). __dirname).

    – Sidney

    16. Februar 2018 um 0:44

  • Entschuldigung, aber es gibt für mich genau das Gleiche zurück, egal ob ich Require verwende oder die Kodierung spezifiziere … @sidney

    – Conrad Scherb

    16. Februar 2018 um 0:46

  • @ConradScherb das kann oft der Fall sein, was bedeutet, dass das Modul require() wird aufgerufen von liegt im selben Verzeichnis wie (oder Ist) die Datei, mit der Sie aufgerufen haben node.

    – Patrick Roberts

    16. Februar 2018 um 0:49


  • @PatrickRoberts, was wäre in diesem Fall die Lösung dafür?

    – Conrad Scherb

    16. Februar 2018 um 0:50

  • @ConradScherb Ich habe Beispiele hinzugefügt, um hoffentlich ihre Unterschiede zu verdeutlichen. Das ist überhaupt kein Problem, die Informationen dienen nur dazu, Sie auf die Nuancen aufmerksam zu machen.

    – Patrick Roberts

    16. Februar 2018 um 0:57

1452920cookie-checkJSON.parse(fs.readFileSync()) gibt einen Puffer zurück – eine Zahlenfolge

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy