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)被一次又一次地调用...
5 分钟后,客户端 2 也连接到服务器,REST 端点开始一次又一次地被调用 (/info/clientId=Client2)。
突然 /info?clientId=Client1 returns 更改了数据,现在是时候做出反应了。我将向打开的网络套接字发送一些特殊响应,但对于客户端 1 和客户端 2,无限循环仍应 运行。
这对所有客户端(在为其他一些客户端提供服务时新连接的客户端也是如此)应该是相同的。
我不知道我应该如何实现这个循环...我试过 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 );
});
});
我有 Node.JS 服务器应用程序,它通过 Web 套接字与更多客户端通信。现在我需要以这种方式扩展我的解决方案:每次当客户端连接到服务器并获得一个唯一的 ID 时,从这一点开始,有必要不断调用一个特殊的 REST API 端点(在某种无限循环)以获取的客户端 ID 作为参数并处理来自 REST API 响应的更改。
示例: - 客户端 1 连接到服务器。打开 Web 套接字并打开通信。此时无限循环开始,REST 端点(例如 /info?clientId=Client1)被一次又一次地调用...
5 分钟后,客户端 2 也连接到服务器,REST 端点开始一次又一次地被调用 (/info/clientId=Client2)。
突然 /info?clientId=Client1 returns 更改了数据,现在是时候做出反应了。我将向打开的网络套接字发送一些特殊响应,但对于客户端 1 和客户端 2,无限循环仍应 运行。
这对所有客户端(在为其他一些客户端提供服务时新连接的客户端也是如此)应该是相同的。
我不知道我应该如何实现这个循环...我试过 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 );
});
});