【发布时间】:2019-08-31 00:20:27
【问题描述】:
我已经尝试学习 NodeJS 有一段时间了。所有的书籍和教程似乎都遵循类似的代码结构模式。示例 -
const express = require('express');
const app = express();
app.set('view engine','hbs');
app.get('/', (req, res) =>{
res.render('index');
});
app.get('/getName', (req, res) =>{
// Mock DB call to fetch Name
res.render('displayName');
});
app.listen(3000, () => {
console.log("Started server on port : 3000");
});
正如您在上面看到的,/getName 控制器正在执行 DB 调用以及返回视图。所以业务逻辑和 CRUD 操作是在同一个地方完成的。
我来自JAVA 的世界,我们的做法略有不同。例如,Spring Boot 应用程序将包含以下结构 -
- DTO
- 存储库
- 服务
- 控制器
因此,controller 类是不执行任何业务逻辑但调用底层service 类来处理所有这些的实际端点。 service 类在 repository 类的帮助下实现业务逻辑和持久化/获取所需的数据。另一方面,存储库处理 CRUD 操作。
这似乎是一种理智的软件开发方式。鉴于每个类都有其定义的角色,因此处理任何更改都变得非常容易。
我知道NodeJs 是动态的,但是-
1.有没有办法像我们在 Spring 中那样分离功能?如果没有,
2。如何构建具有多个端点和数据库事务的大型项目。
问候
编辑 -
考虑以下场景 -
我有一个需求,我需要从数据库中获取状态为 True 的用户列表(假设状态是模型中的布尔字段)。
在 Java 中 -
@Service
public class UserService {
@Autowired
UserDetailRepository userDetailRepository;
@Override
public UserDetail getUserDetail (boolean status) {
UserDetail userDetail = UserDetailRepository .findUserDetailByStatus(status);
return userDetail ;
}
Controller.java -
@GetMapping("/getUserDetails")
public ArrayList<UserDetail> getUserDetail(){
return UserService.getUserDetail(true);
}
现在,如果需求发生变化并且需要一个新的端点,它只返回状态为 true 的前 10 个用户详细信息。在这种情况下,我们可以添加一个新的控制器,并将返回的结果限制为 10。我们可以使用相同的业务逻辑/服务类。
Controller.java
@GetMapping("/getUserDetailsTop10")
public ArrayList<UserDetail> getUserDetail(){
List<UserDetails> users = UserService.getUserDetail(true);
// Filter the list to send top 10
// return users .
}
如果我必须在 NodeJS 中实现相同的用例,我将不得不编写业务逻辑来两次获取用户 -
const express = require('express');
const app = express();
app.set('view engine','hbs');
app.get('/getUserDetails', (req, res) =>{
// Call DB and get users whose status is True
res.send(userdetails);
});
app.get('/getUserDetailsTop10', (req, res) =>{
// Call DB and get users whose status is True
// Filter the returned results and limit the result to 10 values only
res.send(userdetails);
});
app.listen(3000, () => {
console.log("Started server on port : 3000");
});
充其量,我可以将此逻辑抽象为一个函数,该函数将返回一个状态为 True 的用户列表,但这种方法的可扩展性也不是很好。业务逻辑必须与控制器完全分离。
【问题讨论】:
-
问题的格式不是问题,问题的内容才是。有数百种不同的可能同样有效的答案。 Node.js 生态系统丰富多样,没有一种方法可以做到这一点。请务必查看上面的链接,尤其是this one。并不是说这不是一个完全合理的问题,只是不适合 this 网站的格式。
-
类似问题在这里有一定程度的讨论stackoverflow.com/questions/5178334/…
-
嗯,我不是回答你问题的最佳人选。在后端 js 方面没有那么有经验,但我会尝试。 Js 社区拥抱轻量级的东西。我们得到了对一流函数、事件循环等具有原生支持的运行时。这样,我们倾向于自然地在管道链、可观察流、发布/订阅等模式中寻求解决方案。我们也有关注点分离,但不像 java 风格。
-
"唯一的方法是创建一个可以被多个端点引用的函数。" - 是的,这正是你要做的。 (当需要时,否则 YAGNI)。你可以把这些函数放在它们自己的模块、文件中,如果你愿意的话,甚至可以把它们写成类。我不明白你为什么认为这不够充分或可扩展,或者你为什么不认为它来分离关注点。
-
我认为你在 js 领域面对多范式善良时感到概念上的不适。 Java 在函数式编程方面确实有一些负担,但在 js 中没有。 FP 或 OOP,我会根据用例选择合适的。
标签: javascript java node.js spring design-patterns