You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NestJS使用Axios HttpService发请求返回Observable如何获取响应结果

问题根因

@nestjs/axios 提供的 HttpService 底层封装了 RxJS,所有请求方法(get/post等)默认返回 Observable 异步流对象,不会直接返回请求响应结果。你直接打印拿到的只是流实例,既没有触发实际请求,也拿不到接口返回内容。

修复方案

推荐使用 async/await 配合 RxJS 提供的 firstValueFrom 方法把 Observable 转成 Promise 处理,更适配 NestJS 常规的异步业务逻辑,另外你原有代码还有两个会导致reCAPTCHA验证失败的问题,一并修复:

  1. reCAPTCHA 站点验证接口仅接收 application/x-www-form-urlencoded 格式参数,不支持JSON传参
  2. 客户端IP对应的参数名是 remoteip,你之前写的remote是无效参数

完整修正后的代码:

import { Injectable } from '@nestjs/common';
import { HttpService } from '@nestjs/axios';
import { firstValueFrom } from 'rxjs';
import * as qs from 'qs';

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

  async verifyResponse(reCAPTCHAToken: string, clientIp: string): Promise<number> {
    const request$ = this.httpService.post(
      'https://www.recaptcha.net/recaptcha/api/siteverify',
      qs.stringify({
        secret: 'AAAA',
        response: reCAPTCHAToken,
        remoteip: clientIp,
      }),
      {
        headers: {
          'Content-Type': 'application/x-www-form-urlencoded'
        }
      }
    );

    // 等待请求完成,拿到完整响应
    const resp = await firstValueFrom(request$);
    // 接口实际返回内容存放在resp.data字段
    console.log('reCAPTCHA返回结果:', resp.data);
    
    // 按业务逻辑判断返回值即可,示例:验证通过返回1,不通过返回0.2
    return resp.data?.success ? 1 : 0.2;
  }
}

如果项目里没有qs依赖,执行npm i qs安装即可,NestJS 官方示例里也用这个库做表单参数序列化。

不推荐的写法:直接订阅Observable

你也可以直接调用 Observable 的 subscribe 方法订阅结果,但这种写法在 Nest 服务层很难把结果返回给上层的Controller调用,也容易遗漏异常处理,除非是不需要返回值的日志类场景,否则不建议用:

this.httpService.post(/* 请求参数 */).subscribe({
  next: (resp) => console.log(resp.data),
  error: (err) => console.error('reCAPTCHA请求失败', err)
})
注意事项
  • 必须对 Observable 做订阅、或者转Promise处理,才会真正触发HTTP请求,否则请求不会发出去
  • 记得给方法加async,返回值类型改成Promise<number>,否则上层调用拿不到异步结果

内容的提问来源于stack exchange,提问作者Aurora

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 22:45:37