如何使用 NodeJS 发送多个顺序定时的 https 请求?

How to send multiple sequentially timed https requests with NodeJS?

我想使用 NodeJS 发送多个 https 请求。 每个都必须在选定的延迟秒内触发。我使用了这个代码:

const https = require('https');
const sleep = require('sleep');

function sendData(time) {

  var postData = JSON.stringify({
    "time":time
  });

  var options = {
    host: 'hostname.com',
    port: 443,
    path: '/path',
    method: 'POST',
    headers: {
         'Content-Type': 'application/json',
         'Content-Length': postData.length
       }
  };

  var req = https.request(options, (res) => {
    console.log('statusCode:', res.statusCode);
    console.log('headers:', res.headers);

    res.on('data', (d) => {
      process.stdout.write(d);
    });
  });

  req.on('error', (e) => {
    console.error(e);
  });

  req.write(postData);
  req.end();
}

for (var i = 0; i < 3; i++) {
   var timeDate = new Date();
   sendData(timeDate.getTime());
   console.log("Sleeping for some seconds...");
   sleep.sleep(10);
}

输出结果如下:

睡了几秒...

睡了几秒...

睡了几秒...

睡了几秒...

睡了几秒...

睡了几秒...

睡了几秒...

睡了几秒...

睡了几秒...

睡了几秒...

< < < 所有服务器立即响应 > > >

如图所示,所有响应立即到达,就好像程序在一次发送所有 https 请求之前等待所有迭代完成,而不是像预期的那样每 10 秒一次...

你可以使用setInterval(callback, delay) https://nodejs.org/api/timers.html#timers_setinterval_callback_delay_args

第一个参数callback接受一个要执行的函数。 第二个参数 delay 接受以毫秒为单位的时间。 每次延迟结束时都会执行回调。

let sendDataEveryTenSeconds = setInterval(function(){
    sendData(Date());
},1000);

所以每隔 1000 毫秒(10 秒),调用 sendData(Date()) 的匿名函数将执行。

在您的示例中,您希望它在 3 次后停止。 setInterval returns 对定时执行的引用,您可以将其存储在变量中,稍后在需要时调用 clearInterval 停止执行。在您的情况下,您可以设置一个计数器来跟踪函数执行 3 次的时间。

clearInterval(sendDataEveryTenSeconds);

使用 setTimeout(),而不是 sleep() 来安排 activity 以后的某个时间:

const delay = 3000;     // set to whatever you want the spacing to be in ms
for (var i = 0; i < 3; i++) {
   setTimeout(function() {
       console.log("sending data " + i);
       var timeDate = new Date();
       sendData(timeDate.getTime());
   }, delay * i);
}

除调试外,您几乎不希望将睡眠模块用于任何其他事情,因为它会阻止整个 node.js 事件循环,不允许任何其他事情 运行,包括您的网络请求。相反,您需要使用与 node.js.

的事件循环设计一起正常工作的异步逻辑(如 setTimeout())对 node.js 进行编程

注意:这就是您所要求的,及时发送多个请求。但是,当我查看您对结果所做的操作时,您似乎想要确保所有结果都按顺序到达并得到处理。及时发送请求并不能保证这一点。它使它有可能,但不确定。如果您想保证到达顺序或保证处理顺序,您将需要额外的代码。