Я столкнулся с проблемой, связанной с извлечением данных из функции getInitialProps
в Next.js
Сценарий таков: когда пользователь впервые посещает страницу, я делаю http-запрос к удаленному API, которыйвозвращает мне данные, которые мне нужны для приложения.Я делаю запрос внутри метода getInitialProps
, потому что я хочу, чтобы контент полностью отображался при отправке контента пользователю.
Проблема в том, что когда я делаю этот запрос, API возвращает мне сеанскуки, которые мне нужно хранить в браузере, а не на сервере, который воспроизводит контент.Этот файл cookie должен присутствовать в будущих клиентских запросах к API.В противном случае API возвращает мне 403.
Мой вопрос: если я выполняю этот запрос с сервера, и из-за этого ответ также возвращается на сервер, как я могу установить cookie длябраузер, чтобы я мог делать запросы на стороне клиента к API?
Я пытался манипулировать параметром domain
файла cookie, но не могу установить другой домен.Браузер просто игнорирует его.
Вот как выглядит мой getInitialProps
:
static async getInitialProps(appContext) {
const { Component, ctx, router } = appContext;
const { store } = ctx;
let pageProps = {};
if (Component.getInitialProps) {
pageProps = await Component.getInitialProps(appContext);
}
const { hotelId, reservationId } = router.query;
if (!hotelId || !reservationId) return { pageProps };
// Fetching reservation and deal data
try {
const { data, errors, session } = await fetchData(hotelId, reservationId);
if (data) {
store.dispatch(storeData(data));
}
// This works, but the domain will be the frontend server, not the API that I connecting to the fetch the data
if (session) {
ctx.res.setHeader('Set-Cookie', session);
}
// This doesn't work
if (session) {
const manipulatedCookie = session + '; Domain: http://exampe-api.io'
ctx.res.setHeader('Set-Cookie', manipulatedCookie);
}
if (errors && errors.length) {
store.dispatch(fetchError(errors));
return { errors };
} else {
store.dispatch(clearErrors());
return {
...pageProps,
...data
};
}
} catch (err) {
store.dispatch(fetchError(err));
return { errors: [err] };
}
return { pageProps };
}
Функция fetchData - это просто функция, которая отправляет запрос в API.Из объекта ответа я извлекаю cookie и затем назначаю его переменной session
.