Apollo-Client + Express-Graphql Backend - сеанс не сохраняется? - PullRequest
0 голосов
/ 15 октября 2019

Думаю, я чего-то не понимаю. Я пытаюсь подключить мой apollo-клиент localhost:8000 к своему бэкэнду localhost:4000, с клиентом и сервером в разных доменах. Я использую apollo (apollo-boost) на внешнем интерфейсе и express-graphql на серверном ( not (!) Apollo-server ).

Когда я отправляю некоторые данные для входа изклиент на сервер, я получаю ответ: объект пользователя или ошибки и т. д. Так что это здорово. Тем не менее, пользователь на самом деле никогда не входит в систему на сервере (когда я проверяю graphiql и запрашиваю объект пользователя, он всегда равен нулю).

Я не знаю, является ли это проблемой CORS, поскольку используемые вещиработать, когда у меня и клиент и сервер в одном домене?

Вот код на стороне клиента:

import ApolloClient from "apollo-boost"
import fetch from "isomorphic-fetch"
import { HttpLink } from "apollo-link-http"
import { InMemoryCache } from "apollo-cache-inmemory"

const cache = new InMemoryCache()

const link = new HttpLink({
  // uri: "http://localhost:4000/graphql",
  credentials: "include",
})


export const client = new ApolloClient({
  cache,
  fetch,
  link,
  dataIdFromObject: o => o.id,
  uri: "http://localhost:4000/graphql",
})

Соответствующие биты на сервере:

app.use(
  session({
    resave: true,
    saveUninitialized: true,
    secret: 'whatever',
    cookie: {
      secure: false
    },
    store: new MongoStore({
      url: MONGO_URI,
      autoReconnect: true
    })
  })
);

var corsOptions = {
  origin: 'http://localhost:8000',
  credentials: true
};
app.use(cors(corsOptions));
app.use(passport.initialize());
app.use(passport.session());

// Instruct Express to pass on any request made to the '/graphql' route
// to the GraphQL instance.
app.use(
  '/graphql',
  expressGraphQL({
    schema,
    graphiql: true
  })
);

1 Ответ

0 голосов
/ 16 октября 2019

Похоже, их API немного изменился. Я исправил это, выполнив это на стороне клиента:

import ApolloClient from "apollo-boost"
import fetch from "isomorphic-fetch"
import { InMemoryCache } from "apollo-cache-inmemory"

const cache = new InMemoryCache()

export const client = new ApolloClient({
  cache,
  fetch,
  link,
  credentials: "include",
  dataIdFromObject: o => o.id,
  uri: "http://localhost:4000/graphql",
})

Поэтому я включил credentials: "include", прямо в клиент Apollo, а не в httpLink - фактически удалил этот.

...