【问题标题】:Should I save data to DB asynchronously我应该将数据异步保存到数据库吗
【发布时间】:2019-11-03 03:46:12
【问题描述】:

我正在使用 node express 和 postgress。 我不确定我正在尝试做的是一个好的做法还是一个很大的错误。 在我已经向客户端返回结果后,将数据异步保存到数据库。

我尝试用 console.log 来演示它,以检查我的服务器是否会在保存过程中被阻止。

在这里你可以看到status路线和statusB路线。

  app.get("/statusB", async (req, res) => {
    return res.status(200).send("testAAA");
  });

  app.get("/status", async (req, res) => {
    const userStats = await UserController.getData("id")
    const x = test();

    return res.status(200).send(userStats);
  });

  async function test() {
    return new Promise(() => { 
      for (let x = 0; x < 10000; x++) {

        setTimeout( () => {
          console.log(x)
        }, 5000);
      }
    })
  }

如果我发送/status 并在发送statusB 之后,我应该发生什么。

我希望输出是:
/status 将返回 userStats 数据
/StatusB return 'testAAA'
并且计数器将异步运行。


但实际输出是:
- /status 返回用户统计数据
- 计数器运行
- /StatusB return 'testAAA' 仅在计数器完成后

控制台日志只是测试我是否可以异步获取数据并将数据保存到数据库而不是控制台日志。

【问题讨论】:

    标签: node.js express asynchronous


    【解决方案1】:

    取决于您的业务案例。

    如果您的客户可以得到200 OK 状态代码,即使保存实际上可能失败,那么当然,您可以在响应后异步执行。

    在其他情况下,您会希望在请求中进行保存,并且仅在您确定一切安全无恙后才响应。

    【讨论】:

    • 我该怎么做?正如您在我的问题中看到的,事件循环在 console.log 中被阻止。 /statusB 在 for 循环完成之前不会执行
    • console.log() 是同步的,for 循环也是如此。你的数据库不会。
    【解决方案2】:

    这取决于您的逻辑,例如,如果您想将保存的资源返回给客户端,您应该等待(async/await 或callback)直到数据保存到数据库,但例如,如果您只想记录一个没有任何返回到前端的动作你可以异步保存它

    【讨论】:

    • 我该怎么做?正如您在我的问题中看到的,事件循环在 console.log 中被阻止。 /statusB 在 for 循环完成之前不会执行
    【解决方案3】:

    是的,由于 nodejs 的工作方式,您应该将数据异步保存到 db。如果您等待 db 的回答(同步),nodejs 会阻止事件循环并且不处理来自客户端的新请求。但是,如果您的业务逻辑依赖于您应该将答案从数据库返回给客户端的事实,那么您应该同步执行此操作,并且可能会考虑解决方法或选择另一个运行时,如果这会成为问题。

    【讨论】:

    • 我该怎么做?正如您在我的问题中看到的,事件循环在 console.log 中被阻止。 /statusB 在 for 循环完成之前不会执行
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-01
    • 2014-07-04
    • 2013-05-29
    • 2010-12-28
    • 2015-08-20
    相关资源
    最近更新 更多