2014-09-05 114 views
0

我有一个应读取JSON文件并更新此文件(writeFile)的函数。 当我调用这个函数2次或更多时,它不会更新我的文件,并且在第一次调用之后,它将在我的JSON文件的末尾添加1/2个曲形括号。 这里是我的功能:使用node.js读取和写入文件(JSON)

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得到这个错误: 回调( ); TypeError:undefined不是函数 – user3502786 2014-09-05 16:49:11

+0

这是因为第二个函数调用('updateJson(“AAPL”,88);')没有传递回调。试试这个:'updateJson(“AAPL”,88,function(){console.log('hey it worked');});' – 2014-09-05 16:51:01

+0

好吧,第二个工作,让我说我不知道​​多少次我需要调用这个函数,这取决于我的其他功能,因为我从一些服务器获取一些实时数据,有任何选择以不同的方式调用此函数,我的意思是我不知道它是否会是5/10/15倍,所以我不能这样写。 – user3502786 2014-09-05 17:07:00