【发布时间】:2016-03-26 18:25:34
【问题描述】:
我是 node.js 的新手,所以在发布我的 node.js 应用程序之前,我需要确保它能够正常工作。
假设我有一个数组变量,我在脚本开始时初始化它
myArray = [];
然后我从外部 API 中提取一些数据,将其存储在 myArray 中,并使用 setInterval() 方法每 30 分钟再次提取这些数据:
pullData();
setInterval(pullData, 30*60*1000);
pullData() 函数大约需要 2-3 秒才能完成。
客户端将能够使用此函数获取 myArray:
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 服务器获取数据,并且在同一时刻,pullData() 函数正在将数据写入 myArray,导致向客户端发送无效数据?
我阅读了一些文档,我意识到当 pullData() 运行时,createServer() 将在 pullData() 完成其工作之前不会响应客户端? 我真的不擅长理解并发编程,所以我需要您确认一下,或者您是否有更好的解决方案?
编辑:这是我的 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,并且客户端获得的响应将取决于接收请求的机器!这对于小型服务器来说可以正常工作,并且数据将被存储,直到您重新启动服务器! -
这样没问题,要存储的数据不多,每次启动服务器都会重新拉取数据,所以重启服务器时丢失数据是没有问题的。我不会将它与数据库复杂化。无论如何感谢您的回复:)
标签: javascript node.js concurrent-programming