CORS блокирует мутацию в GraphQL Yoga
Я работаю здесь с бэкэндом graphql prisma и сервером графиков Yoga Yoga Express. Во внешнем интерфейсе я пытаюсь вызвать мутацию выхода, но она заблокирована политикой CORS. Несмотря на то, что я добавил настройки cors на моем сервере GraphQl Yoga, я продолжаю получать эту ошибку. Запросы GraphQL работают нормально, но мутации блокируются. URL-адрес моего внешнего интерфейса - " http://localhost:7777/", а сервер йоги работает по адресу " http://localhost:4444/". Ошибка была:
Access to fetch at 'http://localhost:4444/' from origin 'http://localhost:7777' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.
[Network error]: TypeError: Failed to fetch
Конфигурация GraphQL Yoga Server Cors:
server.start(
{
cors: {
credentials: true,
origin: [process.env.FRONTEND_URL],
},
},
deets => {
console.log(
`Server is now running on port http://localhost:${deets.port}`
);
}
);
Мутация:
// import React, { Component } from 'react';
import { Mutation } from 'react-apollo';
import styled from 'styled-components';
import gql from 'graphql-tag';
import { CURRENT_USER_QUERY } from './User';
import { log } from 'util';
const SIGN_OUT_MUTATION = gql`
mutation SIGN_OUT_MUTATION {
signout {
message
}
}
`;
const SignOutBtn = styled.button`
color: ${props => props.theme.textMedium};
padding: 10px;
margin-right: 20px;
text-align: center;
font-family: garamond-light;
border: 1px solid ${props => props.theme.textMedium};
border-radius: 5px;
transition: background-color 0.5s ease;
transition: color 0.5s ease;
:hover {
background: ${props => props.theme.textMedium};
color: ${props => props.theme.white};
}
`;
const Signout = props => (
<Mutation
mutation={SIGN_OUT_MUTATION}
refetchQueries={[{ query: CURRENT_USER_QUERY }]}
>
{signout => (
<SignOutBtn
onClick={() => {
console.log("comes here")
signout();
}}
>
Sign Out
</SignOutBtn>
)}
</Mutation>
);
export default Signout;
Пожалуйста, скажите мне, что я делаю не так здесь. Заранее спасибо.
1 ответ
Решением проблемы было написание промежуточного программного обеспечения, которое устанавливает соответствующие заголовки ответа, чтобы выборка не вызывала сбоев.
server.express.use(function(req, res, next) {
res.header('Access-Control-Allow-Origin', 'http://localhost:7777');
res.header(
'Access-Control-Allow-Headers',
'Origin, X-Requested-With, Content-Type, Accept'
);
next();
});
Выше приведено промежуточное программное обеспечение сервера экспресс-йоги, используемое для решения этой проблемы.
иногда проблема не в cors, это ошибка в вашем бэкэнде. для меня, когда я загружаю изображение на сервер и поскольку моя папка с изображениями находилась внутри проекта, это вызывает изменения в файлах проекта и заставляет сервер узла перезапускаться. поэтому сервер не будет правильно отвечать клиенту, и клиент не получит в ответ заголовок источника доступа. так что по этой причине браузер жалуется.
решение заключалось в том, чтобы переместить папку с изображениями за пределы проекта
Что мне нужно было сделать, это передать источнику массив строковых значений. А также установить новое происхождение PAST_FRONTEND_URL в героку
server.start(
{
cors: {
credentials: true,
origin: [process.env.FRONTEND_URL, process.env.PAST_FRONTEND_URL],
},
},
deets => {
console.log(`Server is now running on port http://localhost:${deets.port}`);
}
);
У меня была такая же проблема, и она была решена этим
server.start(
{
cors: {
credentials: true,
origin: [process.env.FRONTEND_URL],
methods: 'GET,HEAD,PUT,PATCH,POST,DELETE',
preflightContinue: false,
optionsSuccessStatus: 204
}
},
server => {
console.log(`Server is running on http://localhost/${server.port}`);
}
);
Добавление этого промежуточного программного обеспечения помогло в моем случае:
server.express.use((req, res, next) => {
res.header('Access-Control-Allow-Credentials', true)
next()
})