使用 NestJS 进行 Soap 调用
Soap call with NestJS
我必须调用 SOAP 网络服务并为其提供服务。我正在使用 strong-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/)
但没有运气。我要么得到“无法订阅未定义”,要么我的请求在我的控制器没有获取数据并提供数据的情况下传递。
这是我的 controller.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)
});
}
}))
但是我无法在客户端传递我的方法。
谢谢
好的,我找到了解决办法。问题是上面的函数返回了承诺,所以解决方案是初始化新的承诺并处理拒绝和解决。像这样,我们在 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)
}
我必须调用 SOAP 网络服务并为其提供服务。我正在使用 strong-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/) 但没有运气。我要么得到“无法订阅未定义”,要么我的请求在我的控制器没有获取数据并提供数据的情况下传递。
这是我的 controller.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)
});
}
}))
但是我无法在客户端传递我的方法。 谢谢
好的,我找到了解决办法。问题是上面的函数返回了承诺,所以解决方案是初始化新的承诺并处理拒绝和解决。像这样,我们在 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)
}