Node.JS kullanarak bir JSON dosyasını (sunucu) belleğine nasıl okurum?


618

Arka fon

Node.js ile bazı deneyler yapıyorum ve bir JSON nesnesini, bir metin dosyasından veya (daha iyi ??) daha iyi bir bellek dosyasından belleğe okumak istiyorum, böylece koddan hızlı bir şekilde bu nesneye erişebilirsiniz. Orada Mongo, Alfred, vb. Şeyler olduğunu fark ettim, ama şu an ihtiyacım olan şey bu değil.

Soru

Bir JSON nesnesini bir metin veya js dosyasından ve JavaScript / Düğüm kullanarak sunucu belleğine nasıl okurum?


1
sunucu hafızasına ne denir? nodejs betiğiniz çalıştığınız sürece çalışır, ancak nodejs betiğini kalıcı yapmazsanız verileri bir yerde saklamanız gerekir.
20:00

Yanıtlar:


1205

Senkronizasyon:

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

zaman uyumsuz:

var fs = require('fs');
var obj;
fs.readFile('file', 'utf8', function (err, data) {
  if (err) throw err;
  obj = JSON.parse(data);
});

15
Ben JSON.parse senkron olduğunu düşünüyorum, onun doğrudan v8, Async yolu ile bile, insanlar büyük JSON dosyaları ile dikkatli olmak zorunda anlamına gelir. çünkü düğümü bağlayacaktır.
Sean_A91

25
Bütünlüğü uğruna. Onların jsonfile adlı bir npm var .
Stefan

5
Bu basit şeyi bulmanın çok zor olduğuna inanamıyorum. Google'dan aldığım her yanıt bir HTTPRequest yapıyor ya da JQuery kullanıyor ya da tarayıcıda yapıyordu
juliangonzalez

6
iki nokta: (1) Senkron cevap sadece olmalıdır let imported = require("file.json"). (2) JSON.parse zaman uyumsuz olmalıdır, çünkü 70mb JSON dosyasını bir nesne olarak belleğe yüklemek için bu kodu kullandım. Bu milisaniye bu şekilde sürer, ancak ben kullanırsanız require(), bu chugs .
Kyle Baker

8
2019'da ve sonrasında bu yanıtı bulan kullanıcılar için Node.js, birçok sürüm için yerel json desteğine sahipti, requiresadece bir json dosyası yüklemek istiyorsanız bu yanıt artık geçerli değildir. Sadece kullanın let data = require('./yourjsonfile.json')ve gidip gidin (eğer ihtiyaç performansı performansınızı kodunuzu etkiliyorsa, ".json dosyası yüklemek istemenin" ötesinde sorunlarınız olduğu için)
Mike 'Pomax' Kamermans

392

Bunu yapmanın en kolay yolu sadece kullanmak requireve JSON dosyanızın yoludur.

Örneğin, aşağıdaki JSON dosyanız olduğunu varsayalım.

test.json

{
  "firstName": "Joe",
  "lastName": "Smith"
}

Daha sonra bunu kullanarak node.js uygulamanıza kolayca yükleyebilirsiniz. require

var config = require('./test.json');
console.log(config.firstName + ' ' + config.lastName);

35
Sadece millet bilir ve doğru hatırlarsam, requiredüğümde senkron olarak çalışır. Burada
prasanthv

@Ram Benim için çalışıyor olabilir konum test.jsononun örneğinden farklı olurdu. Ben kullanıyorumnode 5.0
guleria

18
Bu yöntemle ilgili başka bir sorun / fayda, önbelleğe alınmış örneği özellikle silmediğiniz sürece gerekli verilerin önbelleğe alınmasıdır
magicode118

13
"gerektirir", uygulamanızın ömrü boyunca kullandığınız modülleri veya yapılandırma dosyasını yüklemek için kullanılır. dosyaları yüklemek için bunu kullanmak doğru görünmüyor.
Yaki Klein

2
Bunun potansiyel olarak bir güvenlik tehdidi olduğunu söyleyebilirim. Yüklediğiniz json dosyası JS kodu içeriyorsa, requirebu kodu çalıştırır mı? Eğer öyleyse, o zaman json dosyalarınızın nereden geldiğini kontrol etmeniz gerekir veya bir saldırgan makinenizde kötü amaçlı kod çalıştırabilir.
sokkyoku

57

Asenkron bir nedenden dolayı var! @Mihai de taş atar

Aksi takdirde, eşzamansız sürümle kullandığı kod:

// 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
}

9
kabul etti :), async de eklendi
mihai

1
Harika :-) Ben olsa inline geri aramalar sevmiyorum, ben kaçınmak istiyorum geri arama kabuslar yol açabilir.
Florian Margaine

9
Bir sebepten ötürü orada .. senkronize olmasını istemediğiniz sürece.
Matt Stephens

40

En azından Düğüm v8.9.1'de şunları yapabilirsiniz:

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

ve JSON nesnesinin tüm öğelerine erişebilirsiniz.


5
Bu yaklaşım dosyayı yalnızca bir kez yükler. file.jsonYeni gereksinimden sonra değiştirirseniz (programı yeniden başlatmadan) veriler ilk yüklemeden olacaktır. Bunu destekleyecek bir kaynağım yok, ama uygulamada bunu yapıyorum
Lukas Ignatavičius

Cevabınız ne yazık ki eksik. Sizi sağlayan şey bir nesnedir ve tostring () uygulamak bile zahmet etmez.
David A. Gray

3
@ DavidA.Gray Soru, nesnelere dize olarak değil, nesne olarak erişmek istiyor. Lukas, bu sorunun gayet iyi olduğunu belirtti.
mikemaccana

2
Require kullanmak ayrıca dosyada rasgele kod yürütür. Bu yöntem güvensiz ve buna karşı tavsiye ederim.
spoulson

16

Düğüm 8'de, util.promisify()bunun gibi bir dosyayı eşzamansız olarak okumak için yerleşik olanı kullanabilirsiniz.

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
  })

3
.readFilezaten senkronize değil, senkronizasyon sürümünü arıyorsanız adıdır .readFileSync.
Aternus

Vaat kullanmak istiyorsanız fs/promises, Düğüm 10'dan itibaren de vardır . Not: API deneyseldir: nodejs.org/api/fs.html#fs_fs_promises_api
aboutaaron

@Aternus .readFileolan asenkron değil async. Anlamı, işlev asyncanahtar kelime ile tanımlanmamıştır ve bir Promise döndürmez, bu yüzden yapamazsınızawait fs.readFile('whatever.json');
Kip

@Kip nasıl bir CodeSandBox?
Aternus

7

kullanılarak düğüm ds-ekstra (zaman uyumsuz bekliyoruz)

const readJsonFile = async () => {
  try {
    const myJsonObject = await fs.readJson('./my_json_file.json');
    console.log(myJsonObject);
  } catch (err) {
    console.error(err)
  }
}

readJsonFile() // prints your json object

6

Kullanılması fs-ekstra paket oldukça basittir:

Senkronizasyon:

const fs = require('fs-extra')

const packageObj = fs.readJsonSync('./package.json')
console.log(packageObj.version) 

zaman uyumsuz:

const fs = require('fs-extra')

const packageObj = await fs.readJson('./package.json')
console.log(packageObj.version) 

3
function parseIt(){
    return new Promise(function(res){
        try{
            var fs = require('fs');
            const dirPath = 'K:\\merge-xml-junit\\xml-results\\master.json';
            fs.readFile(dirPath,'utf8',function(err,data){
                if(err) throw err;
                res(data);
        })}
        catch(err){
            res(err);
        }
    });
}

async function test(){
    jsonData = await parseIt();
    var parsedJSON = JSON.parse(jsonData);
    var testSuite = parsedJSON['testsuites']['testsuite'];
    console.log(testSuite);
}

test();


0

O kadar çok cevap var ki, hiç kimse senkronizasyonu vs async vs gerektirir karşılaştırmak için bir kıyaslama yapmadı. Burada request, readFileSync ve readFile aracılığıyla bellekte json okuma kullanım durumları arasındaki farkı açıkladım .


-1

Hata İşleme ile Asyncbir JSON dosyası yüklemek için eksiksiz bir çözüm arıyorsanızRelative Path

  // 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.
router.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 )
        }
   });
})

Dizin Yapısı:

resim açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.