在Node+Express.js RESTApi中,业务逻辑应该放在哪里?

6

我有以下的Node+Express.js RESTApi架构:

- controllers
- db
-- models
-- config
-- migrations
- helpers
- routes
- services
- test
package.json
index.js

什么地方是放置业务规则的正确位置?(控制器、模型还是服务?)

我不是很确定,但我的业务逻辑被分成了模型和控制器,主要在模型上。 - iagowp
1
只有一个地方可以放置业务逻辑,那就是控制器,因为模型负责处理数据库通信,路由器用于定义路由,而服务则用于交换信息。 - Shailesh Rathod
2个回答

6

从您的文件夹结构中,我了解到您的项目可能以以下方式进行组织。顺便说一下,这仅基于文件夹名称而得出的推测,并不是完美的方案,但或许能为您提供帮助。

- controllers -> logic before saving to the db, check permission, etc..
- db
-- models -> all the stuff who touch a models himself, the schema,etc
-- config -> config about the db, connection to the db etc
-- migrations -> all the migrations file for the db
- helpers -> helpers function like sum, total, pluralize, etc
- routes -> all the rest api route, where they take a controller as callback
- services -> stripe, aws s3 etc
- test -> all your test
package.json -> all your dependencies
index.js -> where everything start, your server instance etc

在您的情况下,业务逻辑应该放在控制器中。模型可以用于添加与数据库值相关的逻辑等。


谢谢!你能给我一些“涉及数据库值的模型逻辑”示例吗? - Douglas Morais
@DouglasMorais 例如,对用户的密码进行哈希处理,将哈希密码与提供的密码进行比较等。 - EQuimper
如果您使用 SQL 数据库,这是您的数据库迁移。例如,如果您使用 Knex https://knexjs.org/#Migrations - EQuimper
@DouglasMorais 一个旧的样板文件,你可以在这里查看模型逻辑 https://github.com/EQuimper/nodejs-api-boilerplate/blob/master/src/models/user.model.js - EQuimper
1
我无法相信没有人给这样一个好的答案点赞,你们这些评论者在干什么? - PirateApp
显示剩余4条评论

3
我对ExpressJS还不太熟悉,但好的一点是它对代码组织并没有像Rails和通常的PHP框架那样强制性。
我按以下方式来构建我的代码:
- 路由:根据之前的评论,将API调用直接指向正确的控制器函数。 - 控制器:接收带有req数据的API调用,在API调用的上下文中进行一些验证(例如:API身份验证等)。 - 服务:控制器然后调用包含业务逻辑的服务。想法是服务(业务逻辑)不与控制器和req数据相关联。服务接收它需要的数据(从已提取的req和其他可能的内容中提取),并返回其他可由控制器用于res数据的数据。

除了关注点分离之外,将业务逻辑与所有其他组件/目录/等分开的目标是使其可以被其他组件重复使用。如果业务逻辑在控制器中,它很可能只能被其中一个控制器重复使用。因此,将业务逻辑放置在“服务”目录中可以达到这个目的。 - Matt Byrnes
这说得很好,@VincentBZ。在服务中如何命名文件呢?每个函数都有自己的文件还是将类似的函数分组到一个文件中?例如,评估从控制器接收的HTML页面并返回页面洞察的函数。 - Tajs
1
我找到了一篇很有用的文章,更深入地阐述了Matt所说的内容。https://www.codementor.io/@evanbechtol/node-service-oriented-architecture-12vjt9zs9i - Tajs
我创建了一个文件,处理多个“相关”的服务。 - VincentBZ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接