web-dev-qa-db-ja.com

HTTPリクエストの結果を返すNestJS

NestJSアプリケーションで、http呼び出しの結果を返します。

NestJS HTTPモジュール の例に従って、私がしていることは単純です:

import { Controller, HttpService, Post } from '@nestjs/common';
import { AxiosResponse } from '@nestjs/common/http/interfaces/axios.interfaces';
import { Observable } from 'rxjs/internal/Observable';

@Controller('authenticate')
export class AuthController {

  constructor(private readonly httpService: HttpService) {}

  @Post()
  authenticate(): Observable<AxiosResponse<any>> {
    return this.httpService.post(...);
  }
}

しかし、クライアントから私は500を取得しており、サーバーコンソールは言っています:

TypeError:ServerResponse.json()でJSON.stringify()stringify(/Users/francesco.borzi/sources/business-controller-rewrite/node_modules/express/lib/response.js:1119:12)で循環構造をJSONに変換します( /Users/francesco.borzi/sources/business-controller-rewrite/node_modules/express/lib/response.js:260:14)at ExpressAdapter.reply(/Users/francesco.borzi/sources/business-controller-rewrite/node_modules /@nestjs/core/adapters/express-adapter.js:41:52)RouterResponseController.apply(/Users/francesco.borzi/sources/business-controller-rewrite/node_modules/@nestjs/core/router/router-responseで-controller.js:11:36)at process._tickCallback(internal/process/next_tick.js:182:7)

8
Francesco Borzi

この問題は、 axios ライブラリに起因しています。これを修正するには、dataプロパティを引き出す必要があります:

return this.httpService.post(...)
  .pipe(
    map(response => response.data),
  );
8

問題は、Responseオブジェクトを直接返そうとしているという事実に起因するようで、それは本質的に循環的です。これを実装する正しい方法はわかりませんが、axiosを直接使用して、プロミスをアンラップし、データのみを返すことで回避できました。

@Post('login')
  async authenticateUser(@Body() LoginDto) {
    const params = JSON.stringify(LoginDto);

    return await axios.post('https://api.example.com/authenticate_user',
      params,
      {
        headers: {
          'Content-Type': 'application/json',
        },
      }).then((res) => {
          return res.data;
    });
}

[〜#〜] update [〜#〜]

新しいrxjsパイプメソッドを使用してhttpServiceから返されるObservableに同じことができることに気づいたので、おそらくそれがより良い方法です。

@Post('login')
async authenticateUser(@Body() LoginDto) {
    const params = JSON.stringify(LoginDto);

    return await this.httpService.post('https://api.example.com/authenticate_user',
      params,
      {
        headers: {
          'Content-Type': 'application/json',
        },
      }).pipe(map((res) => {
    return res.data;
  }));
}
1
andyrue