NodeJS REST API模型和服务结构

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

我试图按照模型服务控制器模式。 我最初的devise有精简的控制器和胖模型,但我觉得模型包含了很多代码,可能需要分解成单独的文件。 所以现在我有一个位于控制器和模型之间的服务层。

我试图实现控制器/ API方法和服务方法之间的1-1映射。

每个单一的服务方法将尝试包含所有由该API方法执行的操作的代码。 我的validation逻辑在服务中。 此服务可能会使用async nodejs模块在内部调用多个模型,处理并将响应传递给其他模型。 但是这被certificate是一个问题。

想象一下,我正在注册一个用户,每个用户都属于一个组织。 –

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

所有这些都是在交易中进行的。

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

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

有没有更好的方法来处理这个问题? 我是否应该首先在服务中对用户和组织进行validation,然后在模型中再次执行validation,还是有更好的方法来处理? 我很乐意进行剧烈的改变。

不幸的是没有干净的好方法来处理这个问题。 我不熟悉使用MariaDB / Cassandra,但我使用Express / Mongooose / MongoDB进行了检查。 问题是有时你需要执行与数据库不相关的validation – 即联系表单,其他非数据库操作。 其他时候,您需要数据库本地validation,如独特的字段检查。 在Mongoose的情况下,有人试图创build基于服务的validation器来检查唯一性,但是他们(根据Mongoose作者)导致100%的时间没有工作,可能是由于竞争条件。

我接触到这个的方式是创build一个前端/路由validation服务/中间件来检查所需的参数等。其中一些可以在数据库中处理,但在联系表单的情况下,一些只需要在服务。 我已经以多种方式扩展了Error对象(如资源未find,前端validation等)来处理这些错误消息。

然后我确定所有错误(前端服务,Mongo,Mongoose)都会冒泡,并在我的控制器中使用next(err)来传递。 所有的错误然后被汇集到一个错误中间件,将不同的错误模型转换成一个统一的格式,然后输出到json。 最终结果是在保持非常干净的设置的同时处理错误的地方具有很大的灵活性。