Файлы cookie Next.js getInitialProps - PullRequest
0 голосов
/ 26 мая 2019

Я столкнулся с проблемой, связанной с извлечением данных из функции 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.

...