Wie lese ich mit Node.JS eine JSON-Datei in den (Server-) Speicher?

Hintergrund

Ich mache einige Experimente mit Node.js und möchte ein JSON-Objekt entweder aus einer Textdatei oder einer .js-Datei (was ist besser?) In den Speicher lesen, damit ich über Code schnell auf dieses Objekt zugreifen kann. Mir ist klar, dass es Dinge wie Mongo, Alfred usw. gibt, aber das ist nicht das, was ich gerade brauche.

Frage

Wie lese ich ein JSON-Objekt mit JavaScript / Node aus einer Text- oder JS-Datei in den Serverspeicher?

 mpm04. Apr. 2012, 14:26
Wie nennt man Serverspeicher? Ihr NodeJS-Skript funktioniert so lange, wie Sie es ausführen, aber Sie müssen Daten irgendwo speichern, es sei denn, Sie machen das NodeJS-Skript dauerhaft.

Antworten auf die Frage(7)

https://nodejs.org/dist/latest-v6.x/docs/api/fs.html#fs_fs_readfile_file_options_callback

<code>
fs.readFile('/etc/passwd', (err, data) => {
  if (err) throw err;
  console.log(data);
});  

// options
fs.readFile('/etc/passwd', 'utf8', callback);
</code>

https://nodejs.org/dist/latest-v6.x/docs/api/fs.html#fs_fs_readfilesync_file_options

Sie finden die gesamte Verwendung von Node.js in den Dokumenten zum Dateisystem!
hoffe diese hilfe für dich!

var json_data = require('/path/to/local/file.json');

und greifen Sie auf alle Elemente des JSON-Objekts zu.

 spoulson16. Apr. 2019, 14:46
Mit require wird auch beliebiger Code in der Datei ausgeführt. Diese Methode ist unsicher und ich würde dagegen empfehlen.
 David A. Gray09. Apr. 2018, 05:05
Ihre Antwort ist absolut unvollständig. Was das bringt, ist ein Objekt, und es stört nicht einmal, tostring () zu implementieren.
 mikemaccana30. Jan. 2019, 12:20
@ DavidA.Gray Die Frage möchte auf die Objekte als Objekte zugreifen können, nicht als Zeichenfolgen. Abgesehen von der Singleton-Frage, die Lukas erwähnte, ist diese Antwort in Ordnung.
 Lukas Ignatavičius12. März 2018, 19:22
Dieser Ansatz lädt die Datei nur einmal. Wenn du das änderstfile.json Nach Neuanforderung (ohne Neustart des Programms) stammen die Daten aus dem ersten Ladevorgang. Ich habe keine Quelle, um dies zu unterstützen, aber ich hatte dies in der App, die ich baue
Lösung für das Problem

Synchronisierung:

<code>var fs = require('fs');
var obj = JSON.parse(fs.readFileSync('file', 'utf8'));
</code>

Async:

<code>var fs = require('fs');
var obj;
fs.readFile('file', 'utf8', function (err, data) {
  if (err) throw err;
  obj = JSON.parse(data);
});
</code>
 xgqfrms02. Nov. 2016, 22:02
Was ist daran falsch? @mihaiAsync-Json-Fehler Hauptcode
 Sean_A9103. Aug. 2015, 06:29
Ich denke, JSON.parse ist synchron, es ist direkt von v8, was bedeutet, dass die Leute auch mit der Async-Methode vorsichtig mit großen JSON-Dateien umgehen müssen. da würde es knoten binden.
 Kyle Baker04. Apr. 2018, 22:36
Ein weiterer Punkt: Dies ist asynchron, aber es ist nichtStreaming. Dazu benötigen Sie eine Bibliothek (z. B. Oboe.js). Der Unterschied ist, dass Async Ihren Ausführungsthread nicht blockiert. Wenn Sie jedoch kein Streaming durchführen, wird der Speicherverbrauch weiterhin massiv ansteigen (z. B. 450 MB Speicher für die Verarbeitung einer 70-MB-JSON-Datei).
 Stefan23. Feb. 2016, 16:37
Der Vollständigkeit halber. Ihr existiert eine npm genanntjsonfile.
 juliangonzalez14. Juni 2017, 19:26
Ich kann nicht glauben, dass es so schwierig war, diese einfache Sache zu finden. Jede Antwort, die ich von Google erhielt, bestand darin, eine HTTP-Anfrage zu stellen, JQuery zu verwenden oder im Browser zu tun
 Mike 'Pomax' Kamermans11. Feb. 2019, 04:12
Für Leute, die diese Antwort im Jahr 2019 und später finden, hat Node.js native JSON-Unterstützung für viele, viele Versionenrequire, mit dieser Antwort ist nicht mehr anwendbar, wenn Sie nur eine JSON-Datei laden möchten. Benutz einfachlet data = require('./yourjsonfile.json') und los geht's (mit der Anmerkung, dass, wenn sich die Leistung von require auf Ihren Code auswirkt, Sie Probleme haben, die weit über das "Laden einer .json-Datei" hinausgehen)
 Nic Hartley31. Okt. 2018, 08:11
@KyleBakerJSON.parse ist synchron.require macht einfach viel mehr alsJSON.parse. JSON.parse analysiert nur JSON.require analysiert JavaScript. Ich bin sicher, Sie können herausfinden, warum letzteres langsamer ist.
 agravat.in16. Jan. 2019, 05:43
Großartig, danke :) Ich habe versucht, mit require ("file.json") zu arbeiten, was gut funktionierte, aber der Pfad meiner file.json war nicht für jedes Betriebssystem festgelegt, so dass es fehlschlug, jetzt funktioniert es großartig. Vielen Dank
 Kyle Baker03. Apr. 2018, 06:09
zwei Punkte: (1) Die synchrone Antwort sollte einfach seinlet imported = require("file.json"). (2) JSON.parse muss asynchron sein, da ich mit diesem Code eine 70-MB-JSON-Datei als Objekt in den Speicher geladen habe. Es dauert auf diese Weise Millisekunden, aber wenn ich benutzerequire()estuckert.

In Node 8 können Sie das eingebaute verwendenutil.promisify() um eine solche Datei asynchron zu lesen

<code>const {promisify} = require('util')
const fs = require('fs')
const readFileAsync = promisify(fs.readFile)

readFileAsync(`${__dirname}/my.json`, {encoding: 'utf8'})
  .then(contents => {
    const obj = JSON.parse(contents)
    console.log(obj)
  })
  .catch(error => {
    throw error
  })
</code>
 aboutaaron25. Sept. 2018, 20:25
Wenn Sie Versprechungen verwenden möchten, gibt es auchfs/promises ab Knoten 10. Hinweis: Die API ist experimentell:nodejs.org/api/fs.html#fs_fs_promises_api
 Aternus26. Mai 2018, 19:45
.readFile ist bereits asynchron. Wenn Sie nach der Synchronisierungsversion suchen, lautet der Name.readFileSync.

Wirft Stein auf @mihai

Ansonsten ist hier der Code, den er mit der asynchronen Version verwendet hat:

<code>// Declare variables
var fs = require('fs'),
    obj

// Read the file and send to the callback
fs.readFile('path/to/file', handleFile)

// Write the callback function
function handleFile(err, data) {
    if (err) throw err
    obj = JSON.parse(data)
    // You can now play with your datas
}
</code>
 mihai04. Apr. 2012, 14:34
einverstanden :), auch asynchron hinzugefügt
 Florian Margaine04. Apr. 2012, 14:37
Toll :-) Ich mag keine Inline-Rückrufe, da kann es zu Rückruf-Albträumen kommen, die ich lieber meide.
 Matt Stephens31. Mai 2016, 11:15
Es gibt einen Grund, es sei denn, Sie möchten es synchron.

require und den Pfad zu Ihrer JSON-Datei.

Angenommen, Sie haben die folgende JSON-Datei.

test.json

<code>{
  "firstName": "Joe",
  "lastName": "Smith"
}
</code>

Sie können dies dann einfach mit in Ihre node.js-Anwendung ladenrequire

<code>var config = require('./test.json');
console.log(config.firstName + ' ' + config.lastName);
</code>
 Ozgur23. Okt. 2017, 15:52
Das wusste ich nicht, danke!
 guleria30. Nov. 2015, 04:40
@Ram Es funktioniert bei mir vielleicht Dein Standorttest.json wäre anders als sein Beispiel. ich benutzenode 5.0
 Damjan Pavlica22. Sept. 2016, 11:46
Bei mir funktioniert das nicht :(
 zalow51701. Jan. 2016, 12:46
Ein weiteres Problem / Vorteil einer solchen Methode ist die Tatsache, dass die erforderlichen Daten zwischengespeichert werden, es sei denn, Sie löschen die zwischengespeicherte Instanz ausdrücklich
 Yaki Klein18. Mai 2016, 11:55
"require" dient zum Laden von Modulen oder Konfigurationsdateien, die Sie während der gesamten Lebensdauer Ihrer Anwendung verwenden. scheint nicht richtig, dies zum Laden von Dateien zu verwenden.
 sokkyoku04. Apr. 2019, 19:46
Ich würde sagen, dies ist möglicherweise eine Sicherheitsbedrohung. Wenn die JSON-Datei, die Sie laden, JS-Code enthält, würderequireFühren Sie den Code aus? Wenn ja, müssen Sie wirklich kontrollieren, woher Ihre JSON-Dateien stammen, oder ein Angreifer könnte bösartigen Code auf Ihrem Computer ausführen.
 prasanthv05. Nov. 2014, 04:04
Nur so Leute wissen, und wenn ich mich richtig erinnere,require im Knoten läuft synchron. Tauchen Sie tief einHier

Wenn Sie eine Komplettlösung für suchenAsync Laden einer JSON-Datei vonRelative Path mit Fehlerbehandlung

<code>  // Global variables
  // Request path module for relative path
    const path = require('path')
  // Request File System Module
   var fs = require('fs');


// GET request for the /list_user page..get('/listUsers', function (req, res) {
   console.log("Got a GET request for list of users");

     // Create a relative path URL
    let reqPath = path.join(__dirname, '../mock/users.json');

    //Read JSON from relative path of this file
    fs.readFile(reqPath , 'utf8', function (err, data) {
        //Handle Error
       if(!err) {
         //Handle Success
          console.log("Success"+data);
         // Parse Data to JSON OR
          var jsonObj = JSON.parse(data)
         //Send back as Response
          res.end( data );
        }else {
           //Handle Error
           res.end("Error: "+err )
        }
   });
})
</code>

Verzeichnisaufbau:

Ihre Antwort auf die Frage