对于节点js来说,我还很陌生,并且在许多内置模块方法具有非阻塞性质(异步)的情况下,关于如何最好地构造代码,存在一些通用问题。
我正在编写一项消费服务,在其中我向一些远程服务提要发出https请求。我从供稿服务器收到重复的数据“卡住”(连接保持打开状态)。我的.on“数据”处理程序接收到的数据块将被处理并写入zip存档。
当feed服务没有更多数据要发送时,将按预期调用.on'end'处理程序。我还提供了超时和错误处理程序。
var fs = require('fs');
var https = require('https');
var options = {
// hostname, port path, etc...
};
var req = https.request( options, function(res) {
res.on('data',function(chunk) {
// invoke code to process data chunk received...
});
res.on('end',function() {
// logic to close out archive
// ??? how do I reissue request to capture next volley of data?
});
});
req.end();
req.setTimeout(REQUEST_TIMEOUT_VALUE, function() {
req.abort();
// ??? how do I reissue request
}
req.on('error', function(err) {
// log error;
// ??? how do I reissue request
}
// ???? How to structure code so I don't exit program when server
// feed is not active?
上面显示的所有代码片段都是在线示例中显示的所有示例中的千篇一律,好消息是如果供稿服务器处于活动状态,则它可以正常工作。我可以看到无数次调用.on'数据'处理程序,并且当没有更多数据需要处理时,也有.on'end'处理程序被调用。太棒了!!!
我正在努力解决的是以下几种情况,因此是我的问题(感谢您对我的耐心):
如果在执行服务器时远程供稿服务器未处于活动状态,则我们永远不会阻塞任何调用,并且我们会遍历所有代码,并且程序已存在。我应该如何构造此代码,以使如果服务器Feed处于不活动状态而我们不退出该程序?我们需要一直保持活跃的阅读状态。
第二个问题(相关),如果我们在请求上超时,我将需要在中止请求后从处理程序中重新在服务器上重新发出请求,同样,从.on'end'处理程序中,我也需要以便在Feed服务器上重新发出该请求,以获取下一轮数据。
构造代码的最佳方法是什么。重新发出请求时,我需要重新定义.on“数据”和.on“结束”处理程序吗?
任何帮助将不胜感激。
预先感谢皮特
答案 0 :(得分:0)
如何每3秒钟重复向站点发出一次请求?您可以通过setInterval来做到这一点:
let requesting = false
setInterval(() => {
if (!requesting) {
requesting = true
// ... make the request
}
}, 3000)
使用requesting
标志可以避免同时发出两个请求。在error
,end
或timeout
事件中,只需将requesting
标志设置为false。