javascript - 使用node.js读写文件(JSON)

标签 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

最佳答案

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

关于javascript - 使用node.js读写文件(JSON),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25690265/

相关文章:

javascript - 使用 getThreads 代码在 GAS 中不起作用

php - 如果不知道如何获取数组键

json - 解码时,检查 JSON 对象是否具有相同键的倍数

javascript - Node.js 在 API 调用上循环

javascript - 如何隐藏每条记录的按钮

javascript - 直接为原型(prototype)的属性赋值与.extend 的区别

javascript - 为什么我的函数在javascript中“未定义”

javascript - 合并 json 对象和 javascript 对象

node.js - 在 Nodejs 中导出的自定义模块中使用函数时出现问题

javascript - 使用 Underscore 删除使用嵌入数组的对象