要解决这个问题:我不是真的在此问题中发布错误!
问题
我最近发现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
})
}
如您所见,代码变得非常凌乱,这实际上是我首先使用全局变量的原因。
我的实际问题
答案 0 :(得分:1)
答案 1 :(得分:1)
(1)在快速路线中使用“全局变量”是否愚蠢?
总体上,全局变量确实被认为是不好的做法。
(2)是否有更好的方法向其他函数提供数据,而不是每次都输入所有自变量
每次输入它们有什么问题?您显示的代码对我来说似乎很好。对于可读性和测试而言,通常最好显式定义函数的依赖关系。
(3)我的假设是否正确,当新请求调用此特定路由时,那些“全局变量”会被覆盖?
是的,默认情况下javascript是同步执行的,直到出现async
/ await
块为止。在您的示例中,不能保证async
块会在发出另一个请求之前得到解决,这会使该代码非常脆弱。