Доступ к файлам cookie из React SSR

Вот простая вещь. Реактивный путь перенаправления маршрутизации зависит от значения в файлах cookie, так как мне его обработать на стороне сервера?

render() {
  something = cookie.get('my-something-value') || 'default '; // always takes defualt value beacuse cookies are not available 
  return (
    <Switch>
      <Route />
      <Route />
      <Redirect to={`/something/${val}`}/>
    </Switch>
  )
}

Так renderToString метод на сервере анализирует элементы в строку, игнорируя это условие, и я получаю неправильное перенаправление, хотя у меня установлены куки

1 ответ

Я столкнулся с подобной проблемой. Это было решено путем:

  • Передайте дополнительную информацию (здесь: serverCookie), содержащую cookie, вашим маршрутам в renderToString.
  • В методе рендеринга (где вы определили все маршруты / редирект); проверьте, вызывается ли он на клиенте или сервере. Если это на стороне сервера, используйте новый prop (здесь: serverCookie), содержащий cookie, в противном случае используйте cookie.get со стороны клиента.
  • Дополнительная информация (здесь: serverCookie) недоступна, когда маршруты отображаются на стороне клиента.

Мой renderToString на стороне сервера выглядел примерно так:

renderToString(
  <Provider store={store}>
    <StaticRouter ...>
      <MyRoutes ... serverCookie={req.headers.cookie} />
    </StaticRouter>
  </Provider>
)

Файл MyRoutes выглядел так:

render(){
  const cookie = isServerSide
    ? this.props.serverCookie
    : cookie.get('my-something-value')
  const path = cookie ? "/pathC" : "/pathD"
  return (
    <Switch>
        <Route
          path="/pathA"
          component={ComponentA}
        />
        <Route
          path="/pathB"
          component={ComponentA}
        />
        <Redirect to={path} />
      ...
    </Switch>
  )
}

Примечание. Перед использованием вам необходимо правильно проанализировать файлы cookie с помощью некоторого анализатора файлов cookie.

Надеюсь, это поможет и решит вашу проблему. Возврат для любых сомнений / разъяснений.

Использовать промежуточное ПО для парсера файлов cookie

npm i cookie-parser

пример

var express = require('express')
var cookieParser = require('cookie-parser')

var app = express()
app.use(cookieParser())

app.get('/', function (req, res) {
  // Cookies that have not been signed
  console.log('Cookies: ', req.cookies)

  // Cookies that have been signed
  console.log('Signed Cookies: ', req.signedCookies)
})

app.listen(8080)
Другие вопросы по тегам