如何在NestJS-soap中记录发送至SOAP接口的XML请求体?
实现查看/记录SOAP请求XML的方法
下面提供两种可行的方案,根据你的需求选择:
方案一:监听SOAP Client的request事件(精准捕获请求体)
在你的服务中,注入soapClient后,通过监听它的request事件来获取每次发送的XML请求内容,代码示例:
import { Inject, Injectable, Logger } from '@nestjs/common'; import { Client } from 'soap'; @Injectable() export class YourSoapService { private readonly logger = new Logger(YourSoapService.name); constructor( @Inject(process.env.APP_NAME) private readonly soapClient: Client, ) { // 监听request事件,捕获请求XML this.soapClient.on('request', (xml: string) => { this.logger.log('SOAP 请求XML:', xml); // 这里可以将xml写入日志文件、存储到数据库,或者做其他处理 }); } async addNumbers() { return await this.soapClient.AddAsync({ intA: 1, intB: 2, }); } }
每次调用SOAP接口时,事件回调都会触发,你可以在里面直接打印或持久化XML内容。
方案二:通过clientOptions开启调试日志(快速查看请求/响应)
在SoapModule.forRoot的配置中,给clientOptions添加参数,让SOAP客户端自动输出请求和响应的详细信息:
方式1:开启debug模式
imports: [ SoapModule.forRoot({ clientName: process.env.APP_NAME, uri: process.env.URL, clientOptions: { debug: true, // 开启后会自动打印请求、响应的XML及其他调试信息 }, }), ]
开启后,控制台会输出包含请求XML的调试日志,不过同时也会打印响应XML和其他内部信息。
方式2:自定义日志器(灵活控制输出)
如果只想关注请求XML,可以自定义日志器过滤内容:
imports: [ SoapModule.forRoot({ clientName: process.env.APP_NAME, uri: process.env.URL, clientOptions: { logger: { log: (message: string) => { // 过滤提取请求XML部分 if (message.includes('request')) { console.log('SOAP 请求XML:', message.split('\n').slice(1).join('\n')); } }, }, }, }), ]
这样可以只打印请求XML内容,避免过多无关日志干扰。
内容的提问来源于stack exchange,提问作者Dewvie
相关产品推荐
相关产品推荐

