Может ли глобальная переменная, установленная во время запроса, проходить через разные запросы - PullRequest
0 голосов
/ 26 марта 2020

Если я установлю глобальную переменную во время обработки запроса, могу ли я передать эту информацию в последующие запросы?

То есть глобальная переменная установлена ​​на каждый запрос, и поскольку nodejs однопоточный Я думаю Я в безопасности, но здесь я прошу повысить уверенность.

Вот мой контекст: я создаю интерфейсный сервис ( Typescript + React), который выполняет рендеринг на стороне сервера, и я хочу настроить приложение для каждого запроса.

Для этого я использую эту технику:

conf.ts:

let CONFIG: any
export function setGlobal (state: any): void {
  CONFIG = state
}

export function getGlobal(): any {
  return CONFIG
}

server.tsx - где настроено приложение Express:

const app = express()

app.get("/*", htmlEndpoint)

function htmlEndpoint (req: express.Request, res: express.Response): void {
  const foo = req.headers["x-foo"] as string || ""

  setGlobal({ foo })
  const context = {}
  const markup = renderToString(
    <StaticRouter location={req.url}>
      <App/>
    </StaticRouter>,
  )

  <... respond with HTML, just boring boilerplate code ...>
}

А теперь где-то глубоко в дереве рендеринга React компонент может сделать это:

export function MyComponent() {
  console.log(getGlobal().foo)
}

Технически, мой вопрос очень узок по объему: вызывая setGlobal при каждом запросе, я реальный риск утечки содержимого этого глобала в другие запросы?

Но в более широком смысле я тоже добро пожаловать любой вид обратной связи и мысли о дизайне , Мне не нравятся глобальные переменные, но я не нашел другого решения, но я также признаю, что не являюсь экспертом ни в одной из выбранных мной технологий, поэтому, возможно, вы поможете мне открыть глаза на альтернативы. Очень рад слышать ваши мысли.

1 Ответ

1 голос
/ 26 марта 2020

Вы правы - поскольку Node является однопоточным, за один раз обрабатывается только один запрос, что означает, что, скорее всего, значение не будет перетекать в другой запрос.

Я думаю, что ваш подход хорош, хотя код может быть не таким читаемым, как мог бы. Не проще ли вместо этого передать значение как реквизит?

Чтобы сделать это, вы можете сделать так:

const global = { value: null }

// To set:
global.value = 'foo'

// To read:
console.log(global.value)

Чтобы передать его как реквизит, вы должны объявить свое приложение. Компонент типа:

function App(props) {
    // To access
    console.log(props.global.value)
}

И в вашем запросе:

<App global={global} />

Затем вам нужно будет передать значение по дереву реакции в зависимости от того, какой компонент в этом нуждается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...