如何获取 Nestjs Http moudle 请求获得的数据?

我尝试使用下列代码获取请求结果,但获得了一个y意外的结果:

import { Injectable } from '@nestjs/common';
import { HttpService } from '@nestjs/axios';

@Injectable()
export class RecaptchaService {
  constructor(private httpService: HttpService) {}
  verifyResponse(reCAPTCHAToken: string, clientIp: string): number {
    const checkResult = this.httpService.post(
      'https://www.recaptcha.net/recaptcha/api/siteverify',
      {
        secret: 'AAAA',
        response: reCAPTCHAToken,
        remote: clientIp,
      },
    );
    console.log(checkResult);
    return 0.2;
  }
}

结果:

Observable {
  source: Observable { _subscribe: [Function (anonymous)] },
  operator: [Function (anonymous)]
}
阅读 6.4k
4 个回答

十分感谢前面两位回答所提供的思路,问题已解决。Nestjs封装的Axios会返回一个Observables对象,查阅Rxjs文档后,使用以下代码有效解决了问题和需求:

import { Injectable } from '@nestjs/common';
import { HttpService } from '@nestjs/axios';
import { lastValueFrom } from 'rxjs';

type VerifyResponse = (
  reCAPTCHAToken: string,
  clientIp: string,
) => Promise<number | boolean>;

@Injectable()
export class RecaptchaService {
  constructor(private httpService: HttpService) {}
  verifyResponse: VerifyResponse = async (reCAPTCHAToken, clientIp) => {
    const checkResultObservable = this.httpService.post(
      'https://www.recaptcha.net/recaptcha/api/siteverify',
      {
        secret: 'AAAA',
        response: reCAPTCHAToken,
        remote: clientIp,
      },
    );
    const checkResult = await (await lastValueFrom(checkResultObservable)).data;
    console.log(checkResult);
    return 0.2;
  };
}

HttpModule 导出 HttpService, 它只是暴露了基于 Axios 的方法来执行 HTTP 请求, 而且还将返回类型转换为 Observables。

看文档里面有说,地址

还有使用的实例

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

  findAll(): Observable<AxiosResponse<Cat[]>> {
    return this.httpService.get('http://localhost:3000/cats');
  }
}

你可以试试 verifyResponse 改成这样,然后打印下verifyResponse()的值,看下是什么,也可以参考下楼下的回答
verifyResponse(reCAPTCHAToken: string, clientIp: string): Observable<AxiosResponse<any>> {

文档看仔细点就不会有这个问题了...

+import { map } from 'rxjs'
   ...
-  verifyResponse(reCAPTCHAToken: string, clientIp: string): number {
+  verifyResponse(reCAPTCHAToken: string, clientIp: string) {
   ...
-    console.log(checkResult)
-    return 0.2
+    return checkResult.pipe(map((res) => res.data))

如果你是一定要在这个方法内获取 response 内容

-  verifyResponse(reCAPTCHAToken: string, clientIp: string) {
+  async verifyResponse(reCAPTCHAToken: string, clientIp: string) {
     ...
+    console.log((await checkResult.toPromise()).data)
新手上路,请多包涵

您好,您发的提问 nest 中使用 http 我看已经解决了,您这边有 demo 代码么。我这边也遇到了 nest 中使用 http 模块的问题,非常感谢能提供 demo 代码仓库。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏