提问者:小点点

Express JS处理多个请求并向发出请求的浏览器返回响应


我已经创建了一个小的Express JS api,它接收关于用户的数据,在本例中是一个包含许多表单字段的应用程序。 我的Express JSendpoint背后的思想是简单地处理进出服务器的请求,然后向发出请求的浏览器(用户)报告,我的当前设置是:

let applications = {}

app.post('/api/submit/:id', (req, res) => {

  try {

    submitApplication(req.body, req.params.id)

    res.status(200).send({
      code: 200,
      success: true
    })

  } catch (error) {

    // handle error

  }

})


function submitApplication (body, id) {

  applications[id] = body != null ? body : {}

  const application = applications[id]

  application.Result = 'Processing'

  axios.post('https://example.com/api', JSON.stringify(applications[id]), {
            headers: {
                'Content-Type': 'application/json'
            }
        })
        .then(response => {

          application.Result = response.data.Result

        })
        .catch(error => {

          // error

        });
}

在上面的代码中,可能有10个不同的浏览器,每个浏览器都向Express JSendpoint提交数据,:id是我在浏览器的客户端生成的唯一生成的编号,以便各个axios请求可以通过相关应用程序的ID更新该应用程序。

我想知道我们是不是。。。 John提交了一个应用程序,然后是Jane,无论SubmitApplication函数将并行运行,还是等待第一个程序完成,从我的观察来看,它似乎是并行运行的,而不是等待第一个程序完成,这正是我所需要的,但我不确定。

Axios中引用的api可能需要3分钟才能返回响应。


共1个答案

匿名用户

是的,在NodeJ上,事情是“并行”运行的。 您的代码正确地处理上下文,因此多个axios操作不会相互混淆数据。

如果你对此不太确定,就读一下诺言吧。 它们是实现.then().catch()的方式。

请注意,在您的代码中:

submitApplication(req.body, req.params.id)
res.status(200).send({code: 200,success: true})

第二行立即运行,而不是在axios成功完成时运行。 如果您想等待,则必须从回调或promise.then()函数中运行第二行。

另请注意:如果您在客户端中随机生成id数字,则明智的做法是从非常大的数字范围中选择它们,以降低冲突的概率。