繁体   English   中英

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

[英]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
    })
}

我发现的问题是,在执行异步函数时,诸如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)在快速路线中使用“全局变量”是否愚蠢?

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

(2)是否有更好的方法向其他函数提供数据,而不是每次都输入所有参数

每次输入它们有什么问题? 您显示的代码对我来说似乎很好。 对于可读性和测试而言,通常最好将函数的依赖关系明确化。

(3)我的假设是正确的,即当新请求调用此特定路由时,那些“全局变量”会被覆盖吗?

是的,JavaScript默认情况下会同步执行,直到出现async / await块。 在您的示例中,不能保证在发出另一个请求之前将先解决async块,这会使该代码非常脆弱。

  1. 取决于全局变量的用法。 如果您拥有对所有请求都有效但可以根据其他条件进行更改的内容,那么我认为使用全局变量完全有意义。 但是对于您的用例,这绝对是您已经发现的错误方法。
  2. 否。唯一的选择是传递具有多个属性而不是多个参数的对象-但基本上是相同的。
  3. 是的,由于变量是全局变量,而请求是异步的,因此每次都会覆盖变量。 根据fetchData函数占用处理程序的时间长短,您将使用错误的数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM