У меня есть функция, которая должна читать JSON-файл и обновлять этот файл (writeFile). Когда я вызываю эту функцию 2 раза или больше, она не обновляет мой файл, и после первого вызова она добавляет 1/2 керлинг-скобки в конце моего файла JSON. Вот моя функция:Чтение и запись файлов (JSON) с помощью node.js
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
Я попробовал первый вариант и я» m получение этой ошибки: callback (); TypeError: undefined не является функцией – user3502786
Это потому, что вызов второй функции ('updateJson (« AAPL », 88);') не передает обратный вызов. Попробуйте это: 'updateJson (« AAPL », 88, function() {console.log ('hey it work');});' –
Хорошо, второй работает, скажем, что я не знаю, сколько раз мне нужно будет вызвать эту функцию, это зависит от моих других функций, потому что я получаю некоторые данные на реальном сервере с какого-либо сервера, есть возможность вызывать эту функцию по-другому, я имею в виду, что я не знаю, будет ли это быть 5/10/15 раз, поэтому я не могу написать это так. – user3502786