我有一个应该读取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
答案 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);
});