После предварительной проверки (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
и это соответствует этому требованию. Вы можете позвонить домену как угодно.