typescript NestJS返回HTTP请求的结果

bqujaahr  于 2023-05-30  发布在  TypeScript
关注(0)|答案(4)|浏览(192)

在我的NestJS应用程序中,我想返回一个http调用的结果。
NestJS HTTP module为例,我所做的很简单:

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,服务器控制台说:
类型错误:将循环结构转换为JSON。stringify()at stringify(/Users/francesco. borzi/sources/business-controller-rewrite/node_modules/express/lib/response。js:一一一九:12)在ServerResponse.json(/Users/francesco. borzi/sources/business-controller-rewrite/node_modules/express/lib/response。js:二百六十:14)在ExpressAdapter。reply(/Users/francesco. borzi/sources/business-controller-rewrite/node_modules/@nestjs/core/adapters/express-adapter。js:四十一:52)在RouterResponseController。apply(/Users/francesco. borzi/sources/business-controller-rewrite/node_modules/@nestjs/core/router/router-response-controller。js:十一:36)在过程中。_tickCallback(internal/process/next_tick. js:一百八十二:(七)

50few1ms

50few1ms1#

此问题来自axios库。为了解决这个问题,你必须取出data属性:

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

z5btuh9x2#

这个问题似乎源于这样一个事实,即我们试图直接返回一个Response对象,而这本质上是循环的。我不确定实现这一点的正确方法,但我能够通过直接使用axios来解决这个问题,打开promise并返回数据。

@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;
    });
}

更新

我意识到我可以使用新的rxjs管道方法对从httpService返回的Observable做同样的事情,所以这可能是更好的方法。

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

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

waxmsbnn3#

如果您正在寻找HTTP数据,HTTP状态码,并希望使用firstValueFrom('rxjs ')将observable转换为promise

const responseData = await firstValueFrom(
        this.httpService.post(url, data, config).pipe(map((response) => [response.data, response.status])),
      );
8e2ybdfx

8e2ybdfx4#

对于我们这些熟悉Axios并希望坚持使用Axios的人,我可以建议以下解决方案:

@Injectable()
export class HttpService {
 constructor(private readonly http: HttpService){}

 fetch(url, params) {
  return this.http.axiosRef.get(url, params)
  }

}

相关问题