【问题标题】:Soap call with NestJS使用 NestJS 进行肥皂调用
【发布时间】:2021-12-26 14:51:48
【问题描述】:

我必须调用 SOAP 网络服务并为其提供服务。我正在使用强肥皂库(https://github.com/loopbackio/strong-soap)。我在服务中获取了我的数据,我可以在 console.log() 中看到它,但我无法将此数据发送到我的控制器以提供服务。我尝试过使用 pipe(map()) 并且我研究了以下主题 (https://www.freecodecamp.org/news/an-express-service-for-parallel-soap-invocation-in-under-25-lines-of-code-b7eac725702e/) 但没有运气。我要么得到“无法订阅未定义”,要么我的请求在我的控制器没有获取数据并提供服务的情况下通过。

这是我的控制器.ts

 export class MyController {

    constructor(private readonly service: Service){}

    @Get('/example')
    getAll(@Query() query: Query){
        return this.service.getAll(query);
    }

}

这是我的服务

    export class Service {

    private URL = process.env.URL;
    constructor() { }

    async getAll(query: OrderRequest) {
        const request = {
            req: {
               req: query,
            }
        };

        return await soap.createClient(this.URL, (err, client) => {
            if (err) {
                console.error(err);
            } else {
                let method = client.myMethodName;
                method(request, (err, result, envelope, soapHeader) => {
                    
            // here I am getting the data but 'return result. is not sending it to the controller        

console.log(result[0])
return result
                });
            }
        });
    }
}

正如我所说,我尝试过这样的地图和管道:

 return await soap.createClient(this.URL).pipe(map((err, client) => {
            if (err) {
                console.error(err);
            } else {
                let method = client.myMethodName; // here I have an error
                method(request, (err, result, envelope, soapHeader) => {
                    console.log(result)
                });
            }
        })) 

但我无法在客户端中传递我的方法。 谢谢

【问题讨论】:

    标签: javascript typescript async-await nestjs


    【解决方案1】:

    好的,我找到了解决方案。事情是上面的函数正在返回承诺,所以解决方案是初始化新的承诺并处理拒绝和解决。像这样,我们在 resolve 中得到结果,并在我们的控制器中使用 .then() 获取它们。

    代码如下:

    service.ts

    getAll(query: Query) {
            const request = {query: {query: query}};
            return new Promise ((resolve, reject) => { // here we add new Promise
                soap.createClient(this.URL, (err, client) => {
                    if (err) {
                        return reject(err); // if error reject promise
                    } else {
                        return resolve(client); // else resolve and send client
                        });
                    }
                });
            }   
        )}
    

    controller.ts

    getAll(@Query() query: query){
        console.log(this.service.getAll(query))
        return this.service.getAll(query).then(result=>result)
    }
    

    【讨论】:

    猜你喜欢
    • 2012-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多