Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 将nodejs请求保持在等待状态,直到第一个请求完成_Node.js - Fatal编程技术网

Node.js 将nodejs请求保持在等待状态,直到第一个请求完成

Node.js 将nodejs请求保持在等待状态,直到第一个请求完成,node.js,Node.js,我遇到了nodejsapi的情况。我想归档的是,当同一个用户同时访问同一个API时,我想阻止或排队等待他的第二个请求,直到第一个请求完成。 PS-我想为同一个用户应用此功能 提前感谢您可以使用信号量来完成此操作。信号量将基于客户端,其中每个客户端在接收请求时只有一个信号量。服务器通过锁定机制停止接收另一个请求,并在响应后释放锁 演示: let clientSemaphores = {}; const semaphore = require('semaphore'); var server = r

我遇到了nodejsapi的情况。我想归档的是,当同一个用户同时访问同一个API时,我想阻止或排队等待他的第二个请求,直到第一个请求完成。 PS-我想为同一个用户应用此功能
提前感谢

您可以使用信号量来完成此操作。信号量将基于客户端,其中每个客户端在接收请求时只有一个信号量。服务器通过锁定机制停止接收另一个请求,并在响应后释放锁

演示

let clientSemaphores = {};
const semaphore = require('semaphore');
var server = require('http').createServer(function(req, res) {
  var client = req.url.split("/")[1];  //client id to specify
  console.log(client, " request recieved");
  if (!clientSemaphores[client] || clientSemaphores[client].current < clientSemaphores[client].capacity){
    clientSemaphores[client] = clientSemaphores[client] || semaphore(1);
    clientSemaphores[client].take(function() {
      setTimeout(() => {
        res.write(client + " Then good day, madam!\n");
        res.end(client + " We hope to see you soon for tea.");
        clientSemaphores[client].leave();
      }, 5000);
    });
  } else {
    res.end(client + " Request already processing... please wait...");
  }
});

server.listen(8000);
让clientSemaphores={};
const semaphore=require('semaphore');
var server=require('http')。createServer(函数(req,res){
var client=req.url.split(“/”[1];//要指定的客户端id
console.log(客户端,“收到请求”);
if(!clientSemaphores[client]| | clientSemaphores[client]。当前{
res.write(客户机+“再见,女士!\n”);
res.end(客户+“我们希望很快能见到你喝茶。”);
clientSemaphores[client].leave();
}, 5000);
});
}否则{
res.end(客户端+“请求已在处理…请稍候…”);
}
});
服务器监听(8000);

HTTP管道化

持久HTTP允许我们重用多个应用程序请求之间的现有连接,但它在客户端上意味着严格的先进先出(FIFO)队列顺序:分派请求、等待完整响应、从客户端队列分派下一个请求。HTTP管道是对该工作流的一个小而重要的优化,它允许我们将FIFO队列从客户端(请求队列)重新定位到服务器(响应队列)。
参考资料:

如果应用程序是无状态的,并且将在生产中水平扩展到两个或多个副本上,我不确定在服务器端执行任何操作(如信号量)是否能够解决此问题

  • 所有POD(应用服务器)都必须为所使用的端点保持相同的信号量值
  • 我认为您可以通过数据库标志实现相同的机制,或者使用Redis来指示操作正在某个应用服务器上进行
  • 它与根据客户机请求进行会话(就维护特定状态而言)一样好
  • 如果端点执行的操作失败或线程崩溃,您还需要一个恢复机制来重置信号量

您可以通过在客户端管理脚本来实现这一点。你想为ajax请求处理这个问题吗?我想在节点端处理这个问题。。我在angular 2I上使用http,我不知道您为什么要从服务器端执行此操作。正如我所知,它应该来自客户端。@techguy,我在回答部分添加了演示代码。我只想为2个API做这件事。。不在服务器上侦听您可以使用全局变量
clientSemaphores
并在这两个端点上实现上述逻辑
take
leave
。我已经分享了上面的例子来理解它。一个问题,它将对请求进行排队或向用户发送响应您可以实施队列系统,也可以不响应请求。这取决于你的要求,我是通过回应你的要求来实现的。