Tair
я оттуда вытаскиваю куку и теперь мне нужно ее где-то сохранить, но так, чтобы другие запросы не видели его
Иван
Ну вот тебе в init надо создавать инстанс аксиоса со вшитой кукой
Tair
Иван
Да куда угодно
Tair
session pollution будет
Tair
например, как глобальный синглтон его точно нельзя хранить
Иван
Между разными юзерами-то?
Tair
ага
Иван
А инит вызывается только при старте сервера, или на каждый запрос?
Tair
Tair
кстати, хороший вопрос
Иван
Ну вот и все. Если на каждый запрос, тебе надо просто этот инстанс пересозадавать
Иван
axios.create({headers:{
Cookie: "cookie1=value; cookie2=value; cookie3=value;"
} })
Tair
Иван
Если только при старте сервера... Ну тогда плохо
Иван
Ну вот куда угодно и кладешь
Tair
))
Иван
Если он на каждый запрос будет пересоздаваться, никакой утечки не будет
Tair
Tair
параллельно 2 юзера если сделают запрос?
Иван
Хм. Я так думаю там каждого будет обслуживать свой инстанс ноды
Иван
У нас же js однопоточный
Tair
SSR же не синхронный, там промис чейн
Иван
Оу
Tair
подтянул данные А, потом данные Б и тд.
Иван
Сек
Tair
щас попробую в прод режиме
Иван
Логично, если у него доступ к реквесту текущему есть
Tair
Tair
в ЖС мире все лучше проверять ))
Иван
Ну вообще да, я твои опасения понимаю
Иван
Вполне возможно что действительно косячно будет
Иван
Попробуй подебажить с помощью брекпоинтов
Tair
Иван
Я чет прям хз как там именно это организовано внутри
Иван
Я б сказал что скорее всего один рендеринг делается в одном потоке
Иван
Но это ваще не точно
Иван
Я б тебе порекомендовал чутка подзапариться с этим вопросом и вникнуть
Иван
Хотя бы с брекпоинтами пошаманить
Иван
Чтобы убедиться что точно не будет утечки
Tair
Вполне возможно что действительно косячно будет
я щас вот так сделал:
const createHttp = state => process.server ? axios.create({
baseURL: 'http://localhost:8080',
headers: {
'Cookie': state.cookie
}
}) : axios
export const actions = {
async nuxtServerInit ({ dispatch, commit }, { req, redirect }) {
if (process.server) {
commit('setCookie', req.headers.cookie)
}
try {
await dispatch('fetchAuth')
} catch (e) {
console.log(e)
redirect('/login')
}
},
async fetchAuth({ state, commit, dispatch }) {
const http = createHttp(state)
const { data } = await http('/api/currentUser')
commit('setAuth', data)
await dispatch('fetchOtherData')
},
...
}
Tair
и вроде все ок, но смущает, что state.cookie прилетает на клиент
Иван
В стейт-то куки зачем запихивать?
Иван
Прям с req бери их
Tair
Иван
Ну так сделай в самом начале let cookie локальной переменной
Иван
А потом в createHTTP её юзай
Иван
Хотяяя
Tair
Иван
Лучше просто в фетч auth очищай кук из стейта, да и все
Tair
я пока кроме как в стейт запихать, ничего умнее не придумал
Иван
Очищай куку и все
Иван
Сразу после того как сделал createHttp
Иван
commit('setCookie', null)
Иван
Или даже в нем самом
Иван
Ну и что?
Tair
там тоже нужна эта кука
Tair
и так далее по цепочке
Иван
Ну значит после него делай
1337
а внутри nuxtServerInit нельзя аксиос создать?
Иван
Ну вот я про это и толкую ему
1337
и юзать его внутри фетчей
Иван
Угу
Tair
и юзать его внутри фетчей
а как передать его в фетчи? если как параметр, то в каждом фетче нужно будет проверять передали его или нет
Иван
Есть опасение что там параллельно может идти рендеринг трех юзеров, например
Иван
Синглтоном его делать
Tair
хотется, чтобы фетчи на ССР и клиенте были идентичные
Tair
Иван
1337
да поидее скоуп свой на каждый запрос должен быть )
1337
если там будет 1000 разных запросов в разные места, тогда вобще каша бы получилась
Tair
const createHttp = state => process.server ? axios.create({
baseURL: 'http://localhost:8080',
headers: {
'Cookie': state.cookie
}
}) : axios
export const actions = {
async nuxtServerInit ({ dispatch, commit }, { req, redirect }) {
try {
if (process.server) {
await dispatch('fetchAuth', createHttp({cookie: req.headers.cookie}))
} else {
await dispatch('fetchAuth')
}
} catch (e) {
console.log(e)
redirect('/login')
}
},
async fetchAuth({ state, commit, dispatch }, httpInstance) {
const http = httpInstance || axios
const { data } = await http('/api/currentUser')
commit('setAuth', data)
await dispatch('fetchOtherData', http)
},
async fetchOtherData({ state, commit, dispatch }, httpInstance) {
const http = httpInstance || axios
const { data } = await http('/api/otherData')
commit('setOtherData', data)
...
},
...
} вот такой еще вариант есть, но это кажется еще хуже
Иван
Ты аксиос откуда импортишь?
Tair
import axios from 'axios' вот так наверху
Иван
Ну вот
Иван
Ты можешь просто делать axios = axios.create(...) и все
Иван
И дальше всегда его просто использовать точно так же