NestJS使用strong-soap调用SOAP服务时无法将Service数据返回给Controller
问题根因
你遇到的问题本质是异步回调的返回值无法透传到外层函数,具体两个错误点:
soap.createClient传入回调参数时,返回值不是Promise,你加await也不会等待回调执行完成,getAll方法会直接返回undefined,Controller自然拿不到返回数据。回调内部的return只会把值返回到回调函数本身,不会向上传递给外层getAll方法。pipe(map)是RxJS的Observable专属方法,strong-soap本身返回值不是Observable,直接调用会报错。
修复方案
把回调风格的SOAP调用手动包装成Promise即可,修改后的Service层代码如下:
export class Service { private URL = process.env.URL; constructor() { } async getAll(query: OrderRequest) { const request = { req: { req: query, } }; // 用Promise包裹回调逻辑 return new Promise((resolve, reject) => { soap.createClient(this.URL, (clientErr, client) => { if (clientErr) { console.error('创建SOAP客户端失败:', clientErr); return reject(clientErr); } client.myMethodName(request, (methodErr, result, envelope, soapHeader) => { if (methodErr) { console.error('调用SOAP接口失败:', methodErr); return reject(methodErr); } console.log('接口返回数据:', result[0]); // 成功时resolve结果,外层await可以直接拿到该值 resolve(result); }); }); }) } }
Controller层代码无需修改,你当前用的框架会自动解析async方法返回的Promise,把结果响应给请求方。
注意事项
- 如果需要统一处理异常格式,可以在Service的catch逻辑中返回自定义错误结构体,也可以在Controller层加
try/catch捕获getAll方法抛出的异常。 - 不要混用回调、Promise、RxJS三种异步编程范式,当前场景用Promise包装是最简单的解决方案。
内容的提问来源于stack exchange,提问作者LaCodeM
相关产品推荐
相关产品推荐

