You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

实现带间隔的Node.js HTTPS批量请求

嘿,我来帮你搞定这个定时发送HTTPS POST请求的需求!首先得提一句:你用的sleep模块是同步阻塞的,在Node.js这种异步优先的环境里,会卡住整个进程,期间没法处理其他事件,这可不是最佳实践。我给你优化成异步非阻塞的版本,同时补全你没写完的代码部分。

先补全并优化你的基础请求函数

首先,把sendData改成返回Promise的异步函数,这样能更好地处理请求的成功/失败,同时修正Content-Length的计算(字符串长度≠字节长度,用Buffer.byteLength更准确):

const https = require('https');

// 封装异步延迟函数,替代同步sleep,不会阻塞进程
function delay(seconds) {
  return new Promise(resolve => setTimeout(resolve, seconds * 1000));
}

// 封装HTTPS POST请求,返回Promise
function sendData(time) {
  return new Promise((resolve, reject) => {
    const postData = JSON.stringify({ "time": time });

    const options = {
      host: 'hostname.com',
      port: 443,
      path: '/path',
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        // 用Buffer.byteLength计算字节数,避免字符/字节不一致的问题
        'Content-Length': Buffer.byteLength(postData)
      }
    };

    const req = https.request(options, (res) => {
      let responseData = '';
      // 收集响应数据
      res.on('data', (chunk) => {
        responseData += chunk;
      });
      // 响应结束时返回结果
      res.on('end', () => {
        console.log(`请求状态码: ${res.statusCode}`);
        console.log('响应内容:', responseData);
        resolve({ statusCode: res.statusCode, data: responseData });
      });
    });

    // 处理请求错误
    req.on('error', (error) => {
      console.error('请求发送失败:', error);
      reject(error);
    });

    // 发送请求数据并结束请求
    req.write(postData);
    req.end();
  });
}

两种批量发送的方案

根据你的需求,我提供两种常见的批量发送模式:

方案1:固定间隔发送(不等待上一个请求完成)

适合不需要严格按顺序执行的场景,不管上一个请求是否成功/完成,到点就发下一个:

async function sendRequests(totalCount, intervalSeconds) {
  for (let i = 0; i < totalCount; i++) {
    const currentTime = new Date().toISOString();
    console.log(`发送第 ${i+1} 次请求 | 时间: ${currentTime}`);
    // 发送请求(不等待完成,继续执行延迟)
    sendData(currentTime).catch(err => console.error(`第 ${i+1} 次请求失败:`, err));
    // 最后一次请求不需要延迟
    if (i < totalCount - 1) {
      await delay(intervalSeconds);
    }
  }
}

// 调用示例:发送5次请求,每次间隔3秒
sendRequests(5, 3).catch(err => console.error('批量请求调度失败:', err));

方案2:等待上一个请求完成后再延迟发送

适合需要严格按顺序执行的场景,必须等上一个请求完成(成功或失败),再等指定时间发下一个:

async function sendRequestsInOrder(totalCount, intervalSeconds) {
  for (let i = 0; i < totalCount; i++) {
    const currentTime = new Date().toISOString();
    console.log(`发送第 ${i+1} 次请求 | 时间: ${currentTime}`);
    try {
      await sendData(currentTime);
      console.log(`第 ${i+1} 次请求成功完成`);
    } catch (err) {
      console.error(`第 ${i+1} 次请求失败:`, err);
    }
    // 最后一次请求不需要延迟
    if (i < totalCount - 1) {
      console.log(`等待 ${intervalSeconds} 秒后发送下一次请求...`);
      await delay(intervalSeconds);
    }
  }
}

// 调用示例:按顺序发送5次请求,每次间隔3秒
sendRequestsInOrder(5, 3).catch(err => console.error('批量请求调度失败:', err));

关键注意点

  • 避免同步阻塞:用异步的delay替代sleep.sleep,保证Node.js进程能正常处理其他事件。
  • 准确计算Content-Length:用Buffer.byteLength(postData)代替postData.length,特别是当请求体包含中文等非ASCII字符时,字符数和字节数会不一致,这会导致服务器解析错误。
  • 错误处理:每个请求都加了错误捕获,避免单个请求失败导致整个批量任务崩溃。

内容的提问来源于stack exchange,提问作者Rafael Pontes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:27:30