0

我在做一个调用一个 api 的项目,这个给定的 API 服务将处理所有给定的数据并将其拆分到不同的集合中。

给定示例

服务.js

async function create(params, origin) {
  const { param1 , param2 , param3 } = params
   
  const collection1 = new db.Collection1(param1)

  await collection1.save()


  const collection2 = new db.Collection2(param2)

  await collection2.save()


  const collection3 = new db.Collection3(param3)

  await collection3.save()
}

我的问题是:

  1. 最佳做法是什么?我是否应该创建一个通用模型模式,将所有集合与参数“param1,param2,param3”进行分组,并将其插入集合中,然后调用另一个函数将所有值拆分为 Collection1,Collection2 ....

  2. 如果一个集合插入引发错误,我该如何处理,以删除所有以前插入的集合?例如 param2 的值无效,但 param1 和 param3 是,我如何处理删除集合 1 和 3 并抛出错误?实现这一目标的最佳方法是什么?

一般上面所有的例子都是简化的,我们说的是至少10个以上的集合和15个以上的参数。

4

1 回答 1

1

基本上,您正在谈论为单个路径提供多个路由处理程序。

通常,您应该在插入数据库之前对输入数据进行服务器端验证和清理,如果规则不匹配,则立即抛出错误,因此不再需要删除前 2 个集合插入以防第 3 个集合插入失败。

查看这方面的 express-validator中间件。

理想情况下,出于多种原因,每个路径应该有一个路由处理程序,但我认为最常见的原因是易于维护和调试(概念上类似于关注点分离)。对不同路径执行一系列请求并最终等待第一个请求的响应以在下一个请求中使用等等(如果是这种情况)更容易。在我看来,您只是增加了一层不需要的复杂性。

如果你作为一个全栈单独开发可能会奏效,但是如果你有一个团队,你做后端,其他人做前端的请求,他遇到问题,这对他来说会困难得多告诉您哪个路径 => 处理程序失败,因为您基本上将多个处理程序隐藏到一个路径 => [handler1,halder2,handler3]。如果您考虑一下,这种行为会导致您的第二个问题。

另一件事是,如果有人只需要从您尝试执行的插入数组中操作单个插入,您会怎么做?您最终可能会创建单独的路径/路由,这意味着您正在复制现有代码。

我认为最好从前端链接/排序不同的请求。它更好,更优雅,遵循 DRY,验证和卫生确实更容易编码,并且它为您的 api 的使用者提供了组合的自由。

于 2020-08-26T08:31:18.647 回答