gpt4 book ai didi

node.js - NodeJS REST API 模型和服务结构

转载 作者:太空宇宙 更新时间:2023-11-03 23:39:03 25 4
gpt4 key购买 nike

我正在使用 Express 和 MariaDB/Cassandra 作为后端编写一个中型应用程序。

我正在尝试遵循模型服务 Controller 模式。我最初的设计有瘦 Controller 和胖模型,但我觉得模型包含大量代码,可能需要分解为单独的文件。现在我有一个位于 Controller 和模型之间的服务层。

我正在尝试实现 Controller /API 方法和服务方法之间的 1-1 映射。

每个服务方法都会尝试包含该 API 方法要执行的所有操作的代码。我的验证逻辑在服务中。然后,该服务可能会使用 async Nodejs 模块在内部调用多个模型,处理响应并将其传递给其他模型。但事实证明这已成为一个问题。

假设我正在注册一个用户,其中每个用户都属于一个组织。 -

  1. 我检查用户是否已存在。
  2. 如果没有,我会为用户创建一个组织。
  3. 我获得了组织 ID。
  4. 我创建用户,并将组织 ID 映射到用户的表中。

所有这些都是在事务内执行的。

如果我将验证放在服务中,那么即使我没有用于插入组织的 Controller /API,我也必须有一个用于插入组织的服务,以便可以在那里执行验证。这将打破服务和 Controller /API 之间的 1-1 映射。

将验证放入模型中的另一个问题是,它将在插入组织或用户之前立即执行。现在,如果组织数据正确,但用户数据不正确,则组织实际上会被插入,但随后必须回滚。

有没有更好的方法来处理这个问题?我应该首先在服务中对用户和组织执行验证,然后在模型中再次执行它,还是有更好的方法来处理这个问题?我愿意进行重大改变。

最佳答案

不幸的是,没有干净的好方法来处理这个问题。我不熟悉使用 MariaDB/Cassandra,但我使用 Express/Mongooose/MongoDB 经历了这个过程。问题是,有时您需要执行与数据库无关的验证 - 即联系表单、其他一些非数据库操作。其他时候,您需要数据库 native 验证来进行唯一字段检查等操作。就 Mongoose 而言,人们曾尝试创建基于服务的验证器来检查唯一性,但它们(根据 Mongoose 作者的说法)可能由于竞争条件而导致 100% 的时间无法工作。

我解决这个问题的方法是创建一个前端/路由验证服务/中间件来检查所需的参数等。其中一些可以在数据库中处理,但就像联系表单的情况一样,有些只需要在服务中。我以多种方式扩展了 Error 对象(例如找不到资源、前端验证等)来处理这些错误消息。

然后,我确保所有错误(前端服务、Mongo、Mongoose)都出现并使用 next(err) 传递到我的 Controller 中。然后,所有错误都会汇集到一个错误中间件中,该中间件将不同的错误模型转换为统一的格式,然后将其输出到 json。最终结果是在处理错误的位置方面具有很大的灵 active ,同时保持非常干净的设置。

关于node.js - NodeJS REST API 模型和服务结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27205723/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com