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

Angular18集成apollo-angular调用GitHub接口一直处于pending状态

Angular 18 集成 apollo-angular 请求 GitHub GraphQL 始终处于 pending 状态

在 Angular 18 中集成 apollo-angular 后,尝试从 GitHub 获取数据时,网络请求一直处于 pending 状态,无任何响应。

Apollo 配置代码

import { ApplicationConfig, inject } from "@angular/core";
import { ApolloClientOptions, ApolloLink, InMemoryCache } from "@apollo/client/core";
import { setContext } from "@apollo/client/link/context";
import { Apollo, APOLLO_OPTIONS } from "apollo-angular";
import { HttpLink } from "apollo-angular/http";

export const githubData = {
  token: "ghp_M4T0mxxxxxxxUqnI4BHWyD6dGmQLk3Fovcb",
};

const uri = "https://api.github.com/graphql";

const header = setContext((operation, context) => ({
  headers: {
    Accept: "charset=utf-8",
  },
}));

const auth = setContext((operation, context) => {
  const token = localStorage.getItem("token");

  if (token === null) {
    return {};
  } else {
    return {
      headers: {
        Authorization: "bearer " + githubData["token"],
      },
    };
  }
});

export function apolloOptionsFactory(): ApolloClientOptions<any> {
  const httpLink = inject(HttpLink);
  const link = ApolloLink.from([header, auth, httpLink.create({ uri })]);
  return {
    link: link,
    cache: new InMemoryCache(),
  };
}

export const graphqlProvider: ApplicationConfig["providers"] = [
  Apollo,
  {
    provide: APOLLO_OPTIONS,
    useFactory: apolloOptionsFactory,
  },
];

服务代码

import { Injectable } from "@angular/core";
import { gql, Query } from "apollo-angular";

@Injectable({
  providedIn: "root",
})
export class GitServiceService extends Query<Response> {
  document = gql`
    query {
      user(login: "3gwebtrain") {
        issues(first: 10) {
          nodes {
            title
            body
            closedAt
          }
        }
      }
    }
  `;
}

组件代码

import { Component, inject, OnInit } from "@angular/core";
import { RouterOutlet } from "@angular/router";

import { GitServiceService } from "./services/git-service.service";
@Component({
  selector: "app-root",
  standalone: true,
  imports: [RouterOutlet],
  templateUrl: "./app.component.html",
  styleUrl: "./app.component.scss",
})
export class AppComponent implements OnInit {
  gitService = inject(GitServiceService);
  ngOnInit(): void {
    console.log("Hellow there");
    this.gitService.watch().valueChanges.subscribe((data) => console.log("data", data));
  }
}

问题排查与解决

1. 上下文链接 headers 被覆盖

当前的 header 和 auth 两个 setContext 链接独立设置 headers,后一个会完全覆盖前一个的 headers,导致 Accept 头丢失。修改 auth 链接代码,合并已有 headers:

const auth = setContext((operation, context) => {
  const token = localStorage.getItem("token");
  const existingHeaders = context.headers || {};

  if (token === null) {
    return { headers: existingHeaders };
  } else {
    return {
      headers: {
        ...existingHeaders,
        Authorization: "bearer " + githubData["token"],
      },
    };
  }
});

2. Token 逻辑矛盾

代码中判断 localStorage.getItem("token") 是否为空,但实际使用的是固定的 githubData["token"]。如果 localStorage 中没有 token,请求会缺失 Authorization 头,GitHub API 会拒绝请求,进而导致请求异常挂起。直接移除 localStorage 判断,确保请求始终携带授权头:

const auth = setContext((operation, context) => {
  const existingHeaders = context.headers || {};
  return {
    headers: {
      ...existingHeaders,
      Authorization: "bearer " + githubData["token"],
    },
  };
});

3. 确认 Apollo 客户端初始化

在 Angular 18 独立组件模式下,确保 graphqlProvider 已正确添加到 bootstrapApplication 的 providers 中:

bootstrapApplication(AppComponent, {
  providers: [...graphqlProvider]
});

4. 添加错误捕获定位问题

当前代码未处理请求错误,添加错误捕获可以直接查看请求失败原因:

this.gitService.watch().valueChanges.subscribe({
  next: (data) => console.log("data", data),
  error: (err) => console.error("请求错误:", err)
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 17:49:51