Я новичок в node.js, поэтому перед выпуском моего приложения node.js мне нужно быть уверенным, что он будет работать так, как должен.node.js - взаимная переменная
Скажем, у меня есть массив переменных и я инициализировать его на начало моего сценария
myArray = [];
затем я тяну некоторые данные из внешнего API, хранить внутри туАггау, и использовать метод setInterval(), чтобы вытащить эти данные снова каждые 30 минут:
pullData();
setInterval(pullData, 30*60*1000);
Функция pullData() занимает около 2-3 секунд, чтобы закончить.
Клиенты смогут получить туАггау с помощью этой функции:
http.createServer(function(request, response){
var path = url.parse(request.url).pathname;
if(path=="/getdata"){
var string = JSON.stringify(myArray);
response.writeHead(200, {'Content-Type': 'text/plain'});
response.end(string);
}
}).listen(8001);
Так что я спрашиваю, может следующая ситуация произойдет ?: Клиент пытается получить данные из этого node.js сервера, и в тот же момент данные записываются в myArray функцией pullData(), что приводит к недействительным данным, отправляемым клиенту?
Я прочитал документацию, и я понял, что при запуске pullData() createServer() не будет отвечать на запросы клиентов до тех пор, пока pullData() не завершит свою работу? Я действительно плохо разбираюсь в параллельном программировании, поэтому мне нужно ваше подтверждение на этом, или если у вас есть лучшее решение?
EDIT: Вот код моей функции pullData():
var now = new Date();
Date.prototype.addDays = function(days){
var dat = new Date(this.valueOf());
dat.setDate(dat.getDate() + days);
return dat;
}
var endDateTime = now.addDays(noOfDays);
var formattedEnd = endDateTime.toISOString();
var url = "https://api.mindbodyonline.com/0_5/ClassService.asmx?wsdl";
soap.createClient(url, function (err, client) {
if (err) {
throw err;
}
client.setEndpoint('https://api.mindbodyonline.com/0_5/ClassService.asmx');
var params = {
"Request": {
"SourceCredentials": {
"SourceName": sourceName,
"Password": password,
"SiteIDs": {
"int": [siteIDs]
}
},
"EndDateTime" : formattedEnd
}
};
client.Class_x0020_Service.Class_x0020_ServiceSoap.GetClasses(params, function (errs, result) {
if (errs) {
console.log(errs);
} else {
var classes = result.GetClassesResult.Classes.Class;
myArray = [];
for (var i = 0; i < classes.length; i++) {
var name = classes[i].ClassDescription.Name;
var staff = classes[i].Staff.Name;
var locationName = classes[i].Location.Name;
var start = classes[i].StartDateTime.toISOString();
var end = classes[i].EndDateTime.toISOString();
var klasa = new Klasa(name,staff,locationName,start,end);
myArray.push(klasa);
}
myArray.sort(function(a,b){
var c = new Date(a.start);
var d = new Date(b.start);
return c-d;
});
string = JSON.stringify(myArray);
}
})
});
Почему вы не используете базу данных для хранения данных? Загрузите его, если вам нужна производительность. Кроме того, если вы начнете масштабирование с помощью нескольких машин, каждая машина получит другой «myArray», и ответ, который получит клиент, будет зависеть от машины, которая получает запрос! Это будет отлично работать для небольшого сервера, и данные будут сохранены до перезапуска сервера! – rohithpr
Это не проблема, так как данных, которые нужно сохранить, не так много, и при каждом запуске серверных данных снова вытягивается, поэтому нет проблем с потерями данных при перезапуске сервера. Я бы не усложнил его с помощью базы данных. Спасибо за ваш ответ в любом случае :) – kecman