2014-09-05 3 views
0

У меня есть функция, которая должна читать JSON-файл и обновлять этот файл (writeFile). Когда я вызываю эту функцию 2 раза или больше, она не обновляет мой файл, и после первого вызова она добавляет 1/2 керлинг-скобки в конце моего файла JSON. Вот моя функция:Чтение и запись файлов (JSON) с помощью node.js

var fs = require('fs'); 

function updateJson(ticker, value) { 
    //var stocksJson = JSON.parse(fs.readFileSync("stocktest.json")); 
    fs.readFile('stocktest.json', function(error, file) { 
     var stocksJson = JSON.parse(file); 



     if (stocksJson[ticker]!=null) { 
      console.log(ticker+" price : " + stocksJson[ticker].price); 
      console.log("changing the value...") 
      stocksJson[ticker].price = value; 
      console.log("Price after the change has been made -- " + stocksJson[ticker].price); 
      console.log("printing the the Json.stringify") 
      console.log(JSON.stringify(stocksJson, null, 4)); 
      fs.writeFile('stocktest.json',JSON.stringify(stocksJson, null, 4) , function(err) { 
          if(!err) { 
           console.log("File successfully written"); 
          } 
          if (err) { 
           console.error(err); 
          } 

         }); 
     } 
     else { 
      console.log(ticker + " doesn't exist on the json"); 
     } 
    }); 
} // end of updateJson 

updateJson("IBM", 77); 
updateJson("AAPL", 88); 

Это мой оригинальный файл в формате JSON (до этого функция была выполнена):

{ 
    "NVDA": { 
     "name": "Nvidia Corporation", 
     "symbol": "NVDA", 
     "logo": "nvidia.png", 
     "price": 0, 
     "prod": "Nvidia Corporation, gforce, g-force, shield" 
    }, 
    "AAPL": { 
     "name": "Apple inc", 
     "symbol": "AAPL", 
     "logo": "apple.png", 
     "price": 0, 
     "prod": "Apple inc, mac, macbook, iphone, ipod, ipad, osx" 
    }, 
    "GOOG": { 
     "name": "Google inc", 
     "symbol": "GOOG", 
     "logo": "google.png", 
     "price": 0, 
     "prod": "search, android, glass, drive, code school" 
    }, 
    "IBM": { 
     "name": "ibm", 
     "symbol": "ibm", 
     "logo": "google.png", 
     "price": 0, 
     "prod": "search, android, glass, drive, code school" 
    } 
} 

Это та часть, где я использую функцию updateJson:

MongoClient.connect("mongodb://" + host + ":" + port + "/" + dbName, function (error, db){ 

    console.log("Connection is opened to : " + "mongodb://" + host + ":" + port + "/" + dbName); 

    var q = async.queue(function (doc, callback) { 
    // code for your update 

      var stockName = doc.ticker; 
      var stockValue = doc.value; 

      var yUrl = "http://finance.yahoo.com/q/ks?s=" + stockName; 
      console.log("The url is : " + yUrl); 
      getStockValue(stockName, yUrl, callback, db); 
      // insert here the update of the json 
      updateJson(stockName, stockValue); 
    }, Infinity); 

var cursor = db.collection(requiredCollection).find(); 
cursor.each(function(err, doc) { 
    if (err) throw err; 
    if(doc!=null) { 
    q.push(doc); // dispatching doc to async.queue 
} 
}); 

q.drain = function() { 
    if (cursor.isClosed()) { 
    console.log('all items have been processed'); 
    db.close(); 
    } 
} 

}); // end of connection to MongoClien 

ответ

3

Вы должны добавить функцию обратного вызова для вашей updateJson функции, так что

updateJson("IBM", 77); 
updateJson("AAPL", 88); 

превращается в:

updateJson("IBM", 77, function() { 
    updateJson("AAPL", 88); 
}); 

function updateJson(ticker, value, callback) { 
    //var stocksJson = JSON.parse(fs.readFileSync("stocktest.json")); 
    fs.readFile('stocktest.json', function(error, file) { 
     var stocksJson = JSON.parse(file); 



     if (stocksJson[ticker]!=null) { 
      console.log(ticker+" price : " + stocksJson[ticker].price); 
      console.log("changing the value...") 
      stocksJson[ticker].price = value; 
      console.log("Price after the change has been made -- " + stocksJson[ticker].price); 
      console.log("printing the the Json.stringify") 
      console.log(JSON.stringify(stocksJson, null, 4)); 
      fs.writeFile('stocktest.json',JSON.stringify(stocksJson, null, 4) , function(err) { 
          if(!err) { 
           console.log("File successfully written"); 
          } 
          if (err) { 
           console.error(err); 
          } 
          callback(); 

         }); 
     } 
     else { 
      console.log(ticker + " doesn't exist on the json"); 
     } 
    }); 
} // end of updaJson 

Я рекомендую использовать библиотеку асинхронной для этого: https://github.com/caolan/async#eachSeries

function updateJson(data, callback) { 
    var ticker = data.ticker; 
    var value = data.value; 
    //var stocksJson = JSON.parse(fs.readFileSync("stocktest.json")); 
    fs.readFile('stocktest.json', function(error, file) { 
     if (error) { 
      callback(error); 
     } 
     var stocksJson = JSON.parse(file); 

     if (stocksJson[ticker]!=null) { 
      console.log(ticker+" price : " + stocksJson[ticker].price); 
      console.log("changing the value...") 
      stocksJson[ticker].price = value; 
      console.log("Price after the change has been made -- " + stocksJson[ticker].price); 
      console.log("printing the the Json.stringify") 
      console.log(JSON.stringify(stocksJson, null, 4)); 
      fs.writeFile('stocktest.json',JSON.stringify(stocksJson, null, 4) , function(err) { 
          if(!err) { 
           callback(null, "File successfully written"); 
          } 
          if (err) { 
           callback(err); 
          } 

         }); 
     } 
     else { 
      callback(ticker + " doesn't exist on the json"); 
     } 
    }); 
} // end of updaJson 

async.eachSeries([ 
    {ticker:"IBM", value:77}, 
    {ticker:"AAPL", value:88} 
], updateJson, function(err, success) { 
    console.log(err, success); 
}); 
+0

Я попробовал первый вариант и я» m получение этой ошибки: callback (); TypeError: undefined не является функцией – user3502786

+0

Это потому, что вызов второй функции ('updateJson (« AAPL », 88);') не передает обратный вызов. Попробуйте это: 'updateJson (« AAPL », 88, function() {console.log ('hey it work');});' –

+0

Хорошо, второй работает, скажем, что я не знаю, сколько раз мне нужно будет вызвать эту функцию, это зависит от моих других функций, потому что я получаю некоторые данные на реальном сервере с какого-либо сервера, есть возможность вызывать эту функцию по-другому, я имею в виду, что я не знаю, будет ли это быть 5/10/15 раз, поэтому я не могу написать это так. – user3502786

Смежные вопросы