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

qv7cva1a  于 2022-11-03  发布在  Node.js
关注(0)|答案(3)|浏览(162)

我有一个Node.JS服务器应用程序,它通过Web套接字与更多的客户端通信。现在我需要以这种方式扩展我的解决方案:每次当客户端连接到服务器并获得唯一ID时,从这一点开始,需要不断调用一个特殊的REST API端点(在某种无限循环中),将获得的客户端ID作为参数,并处理来自REST API响应的更改。
示例:-客户端1连接到服务器。Web套接字打开,通信也打开。此时,无限循环开始,并反复调用REST终结点(例如/info?clientId= Client 1)...

  • 5分钟后,客户端2也连接到服务器,并且开始一次又一次地调用REST端点(/info/clientId= Client 2)。
  • 突然/info?clientId= Client 1返回了更改的数据,现在是时候做出React了。我将向打开的web套接字发送一些特殊的响应,但对于客户端1和客户端2,无限循环仍应运行。

这对于所有客户端都应该是相同的(当正在服务某些其他客户端时,也包括新连接的客户端)。
我不知道我应该如何实现这个循环...我试图谷歌它,但也许如果你能给我一些建议或推荐我一些文章,这将是非常有帮助的我...

bvjxkvbb

bvjxkvbb1#

听起来像是轮询或长轮询。我会把它放在一个单独的模块中,并在新数据上引发一个事件。
我没有测试这段代码,所以你可能需要修复一些东西,但它是一般的想法。

// 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 );                 
  });                                            
});
new9mtju

new9mtju2#

一个典型的死循环轮询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);
        }
    });
}
omtl5h9j

omtl5h9j3#

您可以使用axios和setTimeout()函数调用端点。注意:要确保上一个请求已完全处理,可以使用标志
例如:

let flag=true;
if(flag==true){
setTimeout(()=>{
    axios.post(endpointUrl,reqBody);
},timeout)
}

const endpointName=async (req,res)=>{
//do something with req body and send response.
//make flag false till your processing get complete
//as soon as it gets complete and you want to get the endpoint called again make the flag true.
}

相关问题