[英]Node.js Express Server - Global Variable Issue
为了解决这个问题:我不是真的在这个问题上发布错误!
问题
我最近发现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
})
}
我发现的问题是,在执行异步函数时,诸如payload
, id1
等的全局变量被覆盖。 (如果在第一个请求完成之前发出了下一个请求),则某些功能在输入错误的情况下执行,并且出现了奇怪的响应。
解
然后,我的解决方案是将那些全局变量移到函数内部,这导致大量使用函数参数:
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)我的假设是正确的,即当新请求调用此特定路由时,那些“全局变量”会被覆盖吗?
是的,JavaScript默认情况下会同步执行,直到出现async
/ await
块。 在您的示例中,不能保证在发出另一个请求之前将先解决async
块,这会使该代码非常脆弱。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.