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

Reading and writing files (JSON) using node.js

本文关键字:文件 JSON node js 读取 使用      更新时间:2023-09-26

我有一个函数,应该读取JSON文件并更新该文件(writeFile)。当我调用这个函数两次或两次以上时,它不会更新我的文件,在第一次调用后,它会在我的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

您需要向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);
});