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

Node Soap中createClient创建失败后,重复调用API能否重试创建客户端?

问题:首次创建soapClient失败后,重复调用API接口会重新尝试创建吗?

嘿,我来帮你拆解下这个问题——当前代码逻辑下,重复调用API不会重新尝试创建soapClient,原因如下:

核心问题分析

你写的soap.createClient代码是在路由文件加载时仅执行一次的:

  • 当Node.js服务启动、路由模块被加载时,这段创建client的代码就会立刻跑一遍。
  • 如果这次创建失败,soapClient变量会保持undefined状态,后续再请求/billlinginfo/:id接口时,不会再次触发soap.createClient的执行,直接会因为soapClient未定义而报错。

怎么改才能实现失败后自动重试?

你需要把创建client的逻辑封装成可复用的、带重试机制的函数,每次请求时先检查soapClient是否可用,不可用就重新尝试创建。这里给你一个优化后的方案:

let soapClient = null;
let isCreatingClient = false; // 避免并发请求重复发起创建请求

// 封装带重试的SOAP Client获取函数
function getSoapClient(url, soapHeader, maxRetries = 3) {
  return new Promise((resolve, reject) => {
    // 已有可用Client,直接返回
    if (soapClient) {
      return resolve(soapClient);
    }
    // 正在创建中,等待避免重复请求
    if (isCreatingClient) {
      setTimeout(() => getSoapClient(url, soapHeader, maxRetries).then(resolve).catch(reject), 100);
      return;
    }

    isCreatingClient = true;
    let retryCount = 0;

    function attemptCreate() {
      soap.createClient(url, function(err, client) {
        isCreatingClient = false;
        if (err) {
          retryCount++;
          console.error('创建Client失败,正在重试第', retryCount, '次', err);
          if (retryCount < maxRetries) {
            setTimeout(attemptCreate, 1000); // 间隔1秒重试
          } else {
            reject(err);
          }
        } else {
          client.addSoapHeader(soapHeader);
          soapClient = client;
          resolve(client);
        }
      });
    }

    attemptCreate();
  });
}

然后在路由中调用这个函数:

router.get('/billlinginfo/:id', async function(req, res, next) {
  try {
    // 先确保拿到可用的SOAP Client
    const client = await getSoapClient(yourSoapUrl, yourSoapHeader);
    const args = { AccountNumber: req.params.id };
    
    client.someCall(args, function(err, result) {
      if (err) {
        console.log('接口调用失败', err);
        return res.status(500).send(err);
      }
      res.status(200).send(result);
    });
  } catch (err) {
    console.error('获取SOAP Client失败', err);
    res.status(500).send('无法连接到SOAP服务');
  }
});

优化后的效果

  • 首次创建失败会自动重试指定次数
  • 后续请求如果Client丢失或未初始化,会重新触发创建逻辑
  • 加入isCreatingClient标记,避免多个并发请求同时创建Client造成资源浪费

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:29:49