Node.JS - 我需要在我的应用程序中无限循环调用 REST API 端点

Node.JS - I need to call REST API endpoint in infinite loop in my app

我有 Node.JS 服务器应用程序,它通过 Web 套接字与更多客户端通信。现在我需要以这种方式扩展我的解决方案:每次当客户端连接到服务器并获得一个唯一的 ID 时,从这一点开始,有必要不断调用一个特殊的 REST API 端点(在某种无限循环)以获取的客户端 ID 作为参数并处理来自 REST API 响应的更改。

示例: - 客户端 1 连接到服务器。打开 Web 套接字并打开通信。此时无限循环开始,REST 端点(例如 /info?clientId=Client1)被一次又一次地调用...

这对所有客户端(在为其他一些客户端提供服务时新连接的客户端也是如此)应该是相同的。

我不知道我应该如何实现这个循环...我试过 google 但如果你能给我一些建议或推荐一些文章,也许对我很有帮助.. .

一个典型的无限循环轮询 node.js 中的某个端点将涉及在上一次调用的完成处理程序中调用的 setTimeout()。因此,由于您没有提供真正的代码,下面是它如何工作的概述:

function makeCall(arg1, arg2, arg3) {
    request(...., function(err, data) {
        if (err) {
           // error handling here
        } else {
           // process data here
           // start next API call after some timeout
           setTimeout(function() {
               makeCall(arg1, arg2, arg3);
           }, 5000);
        }
    });
}

听起来像是轮询或长轮询。我会把它放在一个单独的模块中,并在新数据上引发一个事件。

我没有测试此代码,因此您可能需要修复一些问题,但这是一般的想法。

// in poll.js                                    
var events = require('events');                  
var request = require('request');                

function Checker(url) {                          
  var self = this;                               

  function resp(e,r,body) {                      
    if (body.indexOf('new data'===0)) {          
      self.emit('newdata', {data:body.substr(10)});                                                  
    }                                            
    setTimeout(function(){self.check(url, resp);}, 1000);                       
  }                                              

  this.url = url;                                

  this.check = function(url) {                   
    request.get(url, resp);                      
  }                                              

  this.check(url);      

}                                                

Checker.prototype.__proto__ = events.EventEmitter.prototype;


module.exports = Checker;                        

// in server.js                                  
var Checker = require('./poll.js');              
io.on('connection', function (socket) {          
  var checker = new Checker('http://theurl.com/'+socket.id);                                          
  checker.on('newdata', function(data) {         
     socket.emit('newdata', data );                 
  });                                            
});