NodeJS - 无需等待即可调用数据库插入/更新函数吗?

问题描述 投票:0回答:1

我有一个后端应用程序,并且有插入/更新端点。他们大多是:

  1. 检查并验证输入
  2. 将输入提交到db
  3. 返回状态 200/201,其中设置了位置标头,正文包含状态消息

是否可以在第二步中不使用await,以便更快地返回响应?返回的状态将设置为202,表示当前正在处理。第二步抛出错误的可能性非常低,或者如果确实发生,则说明某处存在错误并且与最终用户无关,因此无需将此类错误返回给用户。

这行得通吗?即使这有效,这会是一个好的做法吗?

node.js backend es6-promise
1个回答
3
投票

如果您希望应用程序以这种方式工作并且您确定这是正确的设计并且您已经考虑过会发生什么,那么在执行其他操作(例如发回响应)之前不等待数据库响应成功是可以的(从最终用户的角度来看)如果数据库调用(您没有等待)失败。

但是,忽略可能从数据库调用返回的被拒绝的 Promise 是不行的,因为未处理的 Promise 拒绝不应该发生在 Nodejs 服务器中。 因此,如果您不打算使用

await
,那么您可能需要
.catch()
来捕获并至少记录错误。

这行得通吗?

是的。 该语言或 Nodejs 中没有任何内容可以阻止您在数据库调用完成之前发送响应。 更重要的是这是否是设计响应处理程序的适当方法。

即使这有效,这会是一个好的做法吗?

这不是广泛推荐的做法,因为通常的顺序是这样的:

  1. 检查并验证输入
  2. 将输入提交到db
  3. 如果成功,返回状态 200/201,其中设置了位置标头并且正文包含状态消息
  4. 如果出现错误,则返回适当的错误状态(基于错误类型)和状态消息。

我并不是说你永远不能偏离这个顺序,但这样做通常是例外,而不是规则。

请记住,数据验证不一定能捕获可能导致数据库生成错误的所有内容。 例如,您可以在网站上创建一个新用户,并且电子邮件地址在验证中完全有效,但随后数据库会拒绝它,因为它不是唯一的(已经有一个用户拥有该电子邮件地址)。

并且,数据库本身可能存在问题,导致错误,并且应通知用户他们尝试提交到数据库的事务没有发生,尽管错误不是由用户直接引起的。

© www.soinside.com 2019 - 2024. All rights reserved.