我有一个函数应该读取 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/