После предварительной проверки (cors) запрос сервера изменяется на * и хром не отображает запрос (но я смотрю тело ответа). Как решить проблему?

После предварительной проверки (cors) запрос сервера изменяется на * и хром не отображает запрос (но я смотрю тело ответа).

Заголовки запроса

Ошибка Chrome:

Access to fetch at 'http://localhost:6529/graphql' from origin 'http://localhost:3000' has been blocked by CORS policy: The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'.

Я использую express, cors, graphql, apollo на бэкэнде и реагирую на фронтэнд.

Конфигурация Cors (бэкэнд):

app.use(cors({
    origin: 'http://localhost:3000',
    credentials: true,
    maxAge: 86400,
    optionsSuccessStatus: 200,
    methods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS'].join(','),
}));

Конфигурация заголовков (интерфейс)

const credentials = "include";

let client: ApolloClient<NormalizedCacheObject> | null = null;

export function createClient(cookie: any, ctx: any, store: any): ApolloClient<NormalizedCacheObject> {
  storage.setItem("ctx", ctx);
  client = new ApolloClient({
    cache,
    link: ApolloLink.from([
          onError(({graphQLErrors, networkError}) => {
            if (graphQLErrors) {
              if (!SERVER) {
                const redirectUrl = getRedirect(graphQLErrors);
                if (redirectUrl) {
                  location.assign(redirectUrl);
                }
              }
              graphQLErrors.map(({message, locations, path}) => {
                console.log(
                    `[GraphQL error]: Message: ${message}, Location: ${locations}, Path: ${path}`,
                );

              });
            }
            if (networkError) {
              console.log(`[Network error]: ${networkError}`);

            }
          }),
          new ReduxLink(store),
          new BatchHttpLink({
            credentials,
            uri: GRAPHQL,
            headers: cookie,
            fetchOptions: {
              withCredentials: true,
              credentials,
            },
          }),
        ],
    ),
    ssrMode: SERVER,
    connectToDevTools: true,
  });
  return client;
}

Как решить проблему?

1 ответ

Я сам прошел через проблему, и это был кошмар. Причина, по которой он не работает, заключается в том, что заголовок CORS должен иметь . в этом. http://localhost:3000 не соответствует этой квалификации.

Я решил эту проблему, перейдя в файл моего хоста (на Mac: /etc/hosts) и перенаправление фиктивного домена, такого как api.myapp.local до 127.0.0.1 (localhost). Затем я перенаправил свой интерфейс app.myapp.local, Так что теперь, когда запрос CORS сделан, он из http://app.myapp.local:3000 в http://api.myapp.local:3001 и это соответствует этому требованию. Вы можете позвонить домену как угодно.

Другие вопросы по тегам