请求期间设置的全局变量是否可以跨不同请求泄漏?
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 树中需要它的任何组件。
如果我在处理请求期间设置了一个全局变量,我是否可以将该信息泄漏到后续请求中?
也就是全局变量设置在每个请求上,因为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 树中需要它的任何组件。