【问题标题】:Express JS handle multiple requests and return responses to browser that made requestExpress JS 处理多个请求并将响应返回给发出请求的浏览器
【发布时间】:2020-06-15 13:11:44
【问题描述】:

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

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 JS 端点提交数据,:id 是我在客户端在浏览器中生成的唯一生成数字,以便单个 axios 请求可以通过其 ID 更新相关应用程序。

我试图弄清楚是否让我们说... John 提交了一个应用程序,然后是 Jane,submitApplication 函数是并行运行,还是等到第一个函数完成,从我的观察来看它是并行运行的,不会等到第一个完成,这是我需要的,但我不确定。

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

【问题讨论】:

  • @ifaruki,改变这个提问者的源代码风格可能没有意义。使用单引号和省略分号是所谓的标准 javascript 样式的一部分。 standardjs.com 请考虑回滚您的更改。
  • @O.Jones 回滚

标签: javascript node.js express axios


【解决方案1】:

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

如果您对此不确定,请阅读 Promises。它们就是.then().catch() 的实现方式。

请注意,在您的这段代码中:

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

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

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

【讨论】:

  • 太棒了!谢谢你
猜你喜欢
  • 2018-09-25
  • 2011-12-22
  • 2014-08-04
  • 1970-01-01
  • 1970-01-01
  • 2017-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多