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

Node.js中tcp-ping模块无法向全局变量传递数据求助

Node.js tcp-ping模块异步回调中全局变量数据同步问题解决方案

问题根源

tcpp.ping是异步IO操作,containerip.forEach会快速触发所有ping请求,但回调函数要等ping完成后才执行,直接导致三个核心问题:

  • 变量a的递增时机和回调执行顺序不匹配,cl[a]会指向错误的客户端数据
  • 全局变量compose被多个异步回调同时修改,拼接内容乱序、重复
  • 每次回调都发送Embed消息,而非等所有ping结果收集完成后统一发送

修复后的代码示例

用Promise包装ping操作,通过Promise.all等待所有请求完成后统一处理结果,彻底规避全局变量的异步同步问题:

const containerip = [];
const clients = require('../../clients.json');
const cl = clients['clients'];
// 提前建立IP与客户端名称的映射,避免后续依赖索引找数据
const clientMap = new Map();
for (const key in cl) {
    const client = cl[key].usr;
    containerip.push(client.ip);
    clientMap.set(client.ip, client.name);
}

// 将tcpp.ping包装为Promise,方便异步任务管理
const pingHost = (host) => {
    return new Promise((resolve) => {
        tcpp.ping({ address: host, attempts: 3, port: 80, timeout: 1000 }, (err, data) => {
            const cname = clientMap.get(host);
            if (err || isNaN(data.avg)) {
                resolve(`\n:desktop: **${cname}** → ❌  "Unable to reach client"`);
            } else {
                resolve(`\n:desktop: **${cname}** → ✅  ${Math.round(data.avg)} ms`);
            }
        });
    });
};

// 并行执行所有ping请求,等待全部完成后生成Embed发送
Promise.all(containerip.map(host => pingHost(host)))
    .then(results => {
        const compose = results.join('');
        const embed = new EmbedBuilder()
            .setDescription(compose)
            .setTimestamp()
            .setFooter({ 
                text: 'Rocket Host Philippines', 
                iconURL: 'https://media.discordapp.net/attachments/1029991101081325580/1031234620227858482/1.PNG?width=603&height=603' 
            });
        return client.channels.fetch('1032382346655174708');
    })
    .then(channel => channel.send({ embeds: [embed] }))
    .catch(err => console.error('处理请求出错:', err));

关键优化点

  • 用clientMap存储IP与客户端名称的对应关系,彻底解决异步回调中索引不匹配的问题
  • 将异步的tcpp.ping包装为Promise,通过Promise.all统一管理多个异步任务的执行结果
  • 所有ping结果收集完成后再拼接内容、生成Embed发送,避免重复发消息和内容乱序
  • 移除所有易引发异步同步问题的全局变量,改用局部变量和Promise返回值传递数据

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 19:00:29