gpt4 book ai didi

javascript - Node.js Express 服务器 - 全局变量问题

转载 作者:太空宇宙 更新时间:2023-11-04 03:18:59 26 4
gpt4 key购买 nike

为了解决这个问题:我并没有真正在这个问题中发布错误!

<小时/>

问题
我最近发现我的 Node.js 和 Express 后端代码存在问题,同时从前端发出多个请求。让我们假设我的端点之一如下所示:

var payload, id1, id2, data1, data2

exports.someFunction = async (req, res) => {
payload = req.body.payload
id1 = req.params.id1
id2 = req.query.id2
try {
data1 = await fetchData1()
data2 = await fetchData2()
return responseHandler.success({ data1, data2 })
} catch (err) {
return responseHandler.error(err)
}
}

async function fetchData1() {
return new Promise((resolve, reject) => {
// fetch data from database by accessing
// payload, id1, id2
// here
})
}

我发现的问题是,在执行异步函数时,payloadid1 等全局变量被覆盖。 (如果下一个请求在第一个请求完成之前发出)因此,一些函数会以错误的输入执行,并出现奇怪的响应。

<小时/>

解决方案
我的解决方案是将这些全局变量移到函数内部,这导致函数参数的大量使用:

exports.someFunction = async (req, res) => {
const payload = req.body.payload
const id1 = req.params.id1
const id2 = req.query.id2
try {
const data1 = await fetchData1(payload, id1, id2)
const data2 = await fetchData2(payload, id1, id2, data1)
return responseHandler.success({ data1, data2 })
} catch (err) {
return responseHandler.error(err)
}
}

async function fetchData1(payload, id1, id2) {
return new Promise((resolve, reject) => {
// fetch data from database
})
}

正如您所看到的,代码变得非常困惑,这实际上是我首先使用全局变量的原因。

<小时/>

我的实际问题

  • (1) 在快速路由中使用“全局变量”是不是很愚蠢?
  • (2) 有没有更好的方法为其他函数提供数据,而不是每次都输入所有参数
  • (3) 我的假设是否正确,即当新请求调用此特定路由时,这些“全局变量”会被覆盖?

最佳答案

(1) Is it silly to use "global variables" in express routes?

总体而言,全局变量确实被认为是不好的做法。

(2) Is there a better way of supplying other functions with data, rather than inputting all arguments every single time

每次都输入有什么问题吗?您显示的代码对我来说似乎非常好。明确函数的依赖关系通常更有利于可读性和测试。

(3) Is my hypothesis correct, that those "global variables" are overwritten when a new request calls this specific route?

是的,默认情况下,javascript 是同步执行的,直到出现 async/await block 。在您的示例中,无法保证 async block 将在发出另一个请求之前得到解析,这使得该代码非常脆弱。

关于javascript - Node.js Express 服务器 - 全局变量问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52742904/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com