【问题标题】:NodeJS - Is it OK to call db insert/update functions without await?NodeJS - 可以在没有等待的情况下调用数据库插入/更新函数吗?
【发布时间】:2022-12-06 07:10:38
【问题描述】:
我有一个后端应用程序并且有插入/更新端点。他们大多是这样的:
- 检查并验证输入
- 将输入提交到数据库
- 返回状态 200/201,带有位置标头集,正文包含状态消息
是否可以在没有 await 的情况下进行第二步以便更快地返回响应?返回的状态将设置为 202,表示当前正在处理中。第 2 步抛出错误的可能性极低,或者如果确实存在某个地方出现错误并且与最终用户无关,因此无需将此类错误返回给用户。
这行得通吗?即使这行得通,这也是一个好习惯吗?
【问题讨论】:
标签:
node.js
backend
es6-promise
【解决方案1】:
如果您希望您的应用程序以这种方式工作并且您确定这是正确的设计并且您已经考虑过会发生什么(来自最终用户的观点)如果该数据库调用(您没有等待)失败。
但是,忽略可能从数据库调用返回的被拒绝的承诺是不好的,因为在 nodejs 服务器中不应该发生未处理的承诺拒绝。所以,如果您不打算使用 await,那么您可能需要一个 .catch() 来捕获并至少记录错误。
这行得通吗?
是的。在数据库调用完成之前,语言或 nodejs 中没有任何内容阻止您发送响应。更多的是关于这是否是设计响应处理程序的合适方法。
即使这行得通,这也是一个好习惯吗?
这不是广泛推荐的做法,因为通常的顺序是这样的:
- 检查并验证输入
- 将输入提交到数据库
- 如果成功,返回状态 200/201,设置位置标头,正文包含状态消息
- 如果出错,返回适当的错误状态(基于错误类型)和状态消息。
我并不是说你永远不能偏离这个顺序,但这样做通常是例外,而不是规则。
请记住,数据验证不一定会捕获可能导致数据库生成错误的所有内容。例如,您可能正在您的网站上创建一个新用户,并且电子邮件地址在验证中完全有效,但随后数据库拒绝它,因为它不是唯一的(已经有一个用户使用该电子邮件地址)。
而且,数据库本身可能有问题,导致错误,并且应该通知用户他们试图提交给数据库的事务没有发生,尽管错误不是由用户直接引起的。