请求期间设置的全局变量是否可以跨不同请求泄漏?

Can a global variable set during a request leak across different requests?

如果我在处理请求期间设置了一个全局变量,我是否可以将该信息泄漏到后续请求中?

也就是全局变量设置在每个请求上,因为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,我 运行 是否真的有将全局内容泄漏到其他请求中的风险?

但更广泛地说,我也欢迎 任何 对设计的反馈和想法。我不喜欢全局变量,但还没有找到另一种解决方案,但我也认识到我不是我所选择的任何技术的专家,所以也许你可以帮助我开阔眼界寻找替代方案。很高兴听到你的想法。

你是对的——因为 Node 是单线程的,一次只处理一个请求,这意味着该值肯定不可能泄漏到另一个请求中。

我认为你的方法很好,尽管代码可能没有它应有的可读性。将值作为 prop 传递不是更简单吗?

要做到这一点,您可以这样做:

const global = { value: null }

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

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

要将其作为 prop 传递,您可以像这样声明您的 App 组件:

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

并且在您的请求中:

<App global={global} />

然后您需要将值向下传递到 React 树中需要它的任何组件。