| 1 | import { |
| 2 | CallHandler, |
| 3 | ExecutionContext, |
| 4 | Injectable, |
| 5 | NestInterceptor, |
| 6 | } from '@nestjs/common' |
| 7 | import { Observable } from 'rxjs' |
| 8 | import { switchMap } from 'rxjs/operators' |
| 9 | import * as xml2js from 'xml2js' |
| 10 | |
| 11 | @Injectable() |
| 12 | export class XmlParseInterceptor implements NestInterceptor { |
| 13 | intercept(context: ExecutionContext, next: CallHandler): Observable<any> { |
| 14 | const request = context.switchToHttp().getRequest() |
| 15 | |
| 16 | return new Observable((subscriber) => { |
| 17 | xml2js.parseString( |
| 18 | request.body, |
| 19 | { explicitArray: false }, |
| 20 | (err: any, result: { xml: any }) => { |
| 21 | if (err) |
| 22 | return subscriber.error(err) |
| 23 | request.body = result.xml || {} |
| 24 | subscriber.next(request) |
| 25 | subscriber.complete() |
| 26 | }, |
| 27 | ) |
| 28 | }).pipe( |
| 29 | switchMap(() => next.handle()), // 正确串联后续处理 |
| 30 | ) |
| 31 | } |
| 32 | } |
| 33 |