【问题标题】:在服务器内部调用 API 是一种好习惯吗?
【发布时间】:2022-01-23 10:45:14
【问题描述】:

我有一些代码如下

// [DELETE] /api/v1/authors/:id
async deleteAuthor(req, res) {
  const author = await Author.findByIdAndRemove(req.params.id);
  // delete blogs of the author
  axios.delete(
    `http://localhost:${process.env.PORT}/api/v1/blogs/author/${author._id}`,
    {
      headers: {
        Authorization: req.headers.authorization
      }
    }
  );
  res.status(200).send();
}

借此,我想删除一位作者及其所有博客。我知道 uri 的命名不好,但总体而言,这样的编码是一种好方法,还是有其他方法可以做同样的事情。我正在使用 Node.js 和 Mongoose

【问题讨论】:

  • 通常最好调用一个内部函数来执行操作并且不通过你的 HTTP 层(因为这里的 HTTP 部分只是浪费和不必要的,因为你已经是对的了处理并有权访问您的所有共享代码)。您可以在多个路由中使用相同的内部共享函数。

标签: node.js mongodb mongoose axios


【解决方案1】:

我认为这不是一个好习惯,您应该避免进行循环 HTTP 调用(不是最佳的,可能会出现不必要的重复逻辑并且更难以阅读您的代码) 我建议什么?遵循 DDD 和十六进制。架构:

  1. 有分离的服务(Ej.RemoveAuthor & RemoveAuthorBlogs(遵循 SOLID 的 de SRP 原则,一个服务只做一件事)
  2. 您的 HTTP 端点 (Ej.DELETE /author/:id & DELETE /blogs/author/:id) 将调用这些服务
  3. 如果您需要在同一请求中删除作者及其博客... 3.a => 创建调用 RemoveAuthor 和 RemoveAuthorBlogs 的高级服务 (Ej.RemoveAuthorReferences) 3.b(我的投票是这个)=>服务RemoveAuthor从数据库中删除作者作为第一步,作为第二步将调度一个域事件(Ej.AuthorDeleted将由EventHandler(Ej.@987654327)监听@谁会删除作者的博客)

我认为,当你可以使用自己的服务时,你的服务不应该发出内部http请求,这样,如果逻辑发生变化,你只需要修改服务

【讨论】:

  • 非常感谢,您的回答真的很有帮助。在过去的几天里,我一直在尝试做类似的事情,但由于一些没有留下有用信息的错误而被卡住了。
  • 您能告诉我们这些错误是在何时何地引发的吗?您是否使用一些依赖容器来注入服务?
猜你喜欢
  • 2022-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-04
  • 1970-01-01
  • 2018-03-18
  • 1970-01-01
  • 2020-12-08
相关资源
最近更新 更多