我应该将数据异步保存到数据库吗?

时间:2019-06-20 10:26:36

标签: node.js express asynchronous

我正在使用节点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返回“ testAAA”
并且计数器将异步运行。


但是实际的输出是:
-/status返回userStats数据
-柜台跑
-/StatusB仅在计数器结束后才返回“ testAAA”

仅对控制台日志进行测试,以了解是否可以代替控制台日志异步获取并保存数据到数据库。

3 个答案:

答案 0 :(得分:1)

取决于您的业务案例。

如果即使保存可能实际上失败了,也可以让客户获得200 OK状态代码,那么可以肯定的是,您可以在响应后异步进行操作。

在其他情况下,您将希望在请求中进行保存,并且仅在确定一切都安全无事后做出响应。

答案 1 :(得分:0)

例如,要想将已保存的资源返回给客户端,这取决于您的逻辑,您应该等待(async/awaitcallback)直到将数据保存到数据库,但是例如您只想记录一个操作而无需返回前端,则可以异步保存它

答案 2 :(得分:0)

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