#javascript #node.js #heroku #cookies #graphql
#javascript #node.js #heroku #файлы cookie #graphql
Вопрос:
У меня есть приложение React, которое развернуто в Netlify, и серверная часть GraphQL / express, развернутая на Heroku.
Я использую файл connect.sid
cookie на сервере для сохранения входа в систему и обработки других внутренних запросов, например, платежей stripe. Файл cookie создается в моей локальной среде разработки; однако в рабочей среде (сервер postgres db, развернутый на Heroku клиент, развернутый на Netlify) файл connect.sid
cookie не отправляется обратно клиенту.
Однако при просмотре журналов Heroku я могу сказать, что файл cookie генерируется. Он просто не может быть использован или виден клиентом.
Вот мой сервер узла:
const startServer = async () => {
if (typeOrmOptions.url) {
await createConnection(typeOrmOptions); // --> was this before
} else {
await createConnection(); // --> was this before
}
const server = new ApolloServer({
typeDefs,
resolvers,
context: ({ req }: any) => ({ req }),
introspection: true,
playground: true
});
const app = express();
const forceSsl = function(req, res, next) {
if (req.headers["x-forwarded-proto"] !== "https") {
return res.redirect(["https://", req.get("Host"), req.url].join(""));
}
return next();
};
app.use(forceSsl);
app.set("trust proxy", 1);
app.use(
session({
resave: false,
saveUninitialized: false,
cookie: {
maxAge: 86400000,
domain
},
store: new MemoryStore({
checkPeriod: 86400000 // prune expired entries every 24h
}),
secret: "keyboard cat"
})
);
server.applyMiddleware({
app,
cors: {
origin: webUrl,
credentials: true
}
});
app.listen({ port: port }, () =>
console.log(
`🚀 Server ready at http://localhost:${port}${server.graphqlPath}, weburl = ${webUrl}`
)
);
};
startServer();
Вот клиент React
const serverUrl =
process.env.NODE_ENV === "development"
? "http://localhost:4000"
: "https://server-domain.com";
const client = new ApolloClient({
uri: `${serverUrl}/graphql`,
credentials: "include"
});
function App() {
console.log(serverUrl, "uri");
return (
<ApolloProvider client={client}>
<ThemeProvider theme={theme}>
<Routes/>
</ThemeProvider>
</ApolloProvider>
);
}
export default App;
- Вывод сети на локальном хосте
- Вывод файла cookie на локальном хосте
- Вывод сети в рабочей среде
- Вывод файла cookie (или его отсутствие) в рабочей среде
- Вывод консоли в рабочей среде
- Вывод журнала Heroku
Как вы можете видеть, сеансы регистрируются на стороне сервера … они просто не доходят до клиента.
Бьюсь головой о стену — буду признателен за любую помощь!
Любые предложения о том, как это исправить?