使用node.js读取和写入文件(JSON)

时间:2014-09-05 16:28:52

标签: javascript json node.js mongodb

我有一个应该读取JSON文件并更新此文件(writeFile)的函数。 当我调用此函数2次或更多时,它不会更新我的文件,在第一次调用之后它会在我的JSON文件末尾添加1/2卷曲括号。 这是我的功能:

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

1 个答案:

答案 0 :(得分: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);
});