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
相关产品推荐
相关产品推荐

