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

NestJS使用strong-soap调用SOAP服务时无法将Service数据返回给Controller

问题根因

你遇到的问题本质是异步回调的返回值无法透传到外层函数,具体两个错误点:

  1. soap.createClient 传入回调参数时,返回值不是Promise,你加await也不会等待回调执行完成,getAll方法会直接返回undefined,Controller自然拿不到返回数据。回调内部的return只会把值返回到回调函数本身,不会向上传递给外层getAll方法。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 03:57:03