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

时间:2018-10-10 14:45:27

标签: javascript node.js express server backend

要解决这个问题:我不是真的在此问题中发布错误!


问题
我最近发现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)我的假设是否正确,当新请求调用此特定路由时,那些“全局变量”会被覆盖?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

  

(1)在快速路线中使用“全局变量”是否愚蠢?

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

  

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

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

  

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

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