“预检响应中的 Access-Control-Allow-Headers 不允许请求标头字段模式”如何解决 Apollo 的问题?

Posted

技术标签:

【中文标题】“预检响应中的 Access-Control-Allow-Headers 不允许请求标头字段模式”如何解决 Apollo 的问题?【英文标题】:"Request header field mode is not allowed by Access-Control-Allow-Headers in preflight response" how to solve problem with Apollo? 【发布时间】:2021-04-07 07:58:55 【问题描述】:

当我使用 gql 发出简单的 fetch 请求时,它工作正常,但是当我尝试使用 apollo 客户端创建它时,它显示此错误 Access to fetch at 'bla-bla' from origin 'http:// localhost:3000' 已被 CORS 策略阻止:在预检响应中 Access-Control-Allow-Headers 不允许请求标头字段模式。

这是我的 Apollo 客户:

import 
  ApolloCache,
  ApolloClient,
  HttpLink,
  InMemoryCache,
  concat,
  NormalizedCacheObject,
 from "@apollo/client";
import  setContext  from "@apollo/client/link/context";

const createApolloClient = (isServer: boolean) => 
  const httpLink = new HttpLink( uri: process.env.REACT_APP_GRAPHQL );
  const accessToken = localStorage.getItem(
    "CognitoIdentityServiceProvider.653kt2v1novmi53toi3uc82m4f.Google_112862354108088073641.accessToken"
  );

  const authLink = setContext(async (_,  headers ) => 
    return 
      headers: 
        ...headers,
        mode: "no-cors",
        "Access-Control-Allow-Origin": "*",
        'Authorization': accessToken,
      ,
    ;
  );

  const cache = new InMemoryCache().restore(
    !isServer ? (window as any).__APOLLO_STATE__ : 
  ) as ApolloCache<NormalizedCacheObject>;

  const client = new ApolloClient<NormalizedCacheObject>(
    cache,
    defaultOptions: 
      watchQuery: 
        fetchPolicy: "cache-first",
      ,
    ,
    link: concat(authLink, httpLink),
    s-s-rMode: isServer,
    s-s-rForceFetchDelay: isServer ? 100 : undefined,
  );

  return client;
;

export default createApolloClient;

【问题讨论】:

【参考方案1】:

更改下方并尝试...

之前

  const authLink = setContext(async (_,  headers ) => 
    return 
      headers: 
        ...headers,
        mode: "no-cors",
        "Access-Control-Allow-Origin": "*",
        'Authorization': accessToken,
      ,
    ;
  );

之后

const authLink = setContext(async (_,  headers ) => 
    return 
        headers: 
            ...headers,
            mode: "no-cors",
            "Access-Control-Allow-Origin": "*",
            'Access-Control-Allow-Methods': 'GET,PUT,POST,DELETE,PATCH,OPTIONS',
            "Access-Control-Allow-Credentials": true,
            'Authorization': accessToken,
        ,
    ;
);

【讨论】:

以上是关于“预检响应中的 Access-Control-Allow-Headers 不允许请求标头字段模式”如何解决 Apollo 的问题?的主要内容,如果未能解决你的问题,请参考以下文章