我使用sails.js构建了一个web应用程序,我对该应用程序的设计有一些问题:
- 我应该为每个页面、组件或模型创建控制器吗?我在文档和一些教程中看到,他们为每个模型创建控制器。这看起来不错,但如果我有一个复杂的页面/组件,并且我想创建具有多模型(和数据)的视图,这对我没有帮助
- 我应该把组件或功能的业务逻辑部分放在哪里?我读过关于Serivce的文章,但我不确定这是不是合适的地方
总之,我看到在sails中,代码是像模型一样排列的(每个模型都有模型、控制器和视图),但如果我想按功能、组件或页面排列呢?
谢谢!
基本上,每个模型都应该有控制器(但如果不需要特定的控制器,并且它是空的,则不需要创建它)。每个模型都有一个控制器,这是一个很好的做法。
如果您在许多地方使用代码的某个部分,并且它没有与一个指定的模型连接,那么它应该是服务(如发送电子邮件、通知、日志记录、图像处理)。阅读DRY
控制器应尽可能简单。它应该包含对Model和Service的调用以及带有呈现输出的回调。所有业务逻辑都应该在Models中。
我为更复杂的模型(如用户)创建了一些额外的"助手"模型,以使类更短。
综上所述。应用程序的核心是Model。它不仅负责数据库层,还负责应用程序的业务层。稍后是控制器。它从模型中获取数据,并将其传递给视图,视图负责表示从模型中获得的数据。
第一个答案
Sails是针对REST API的,它与视图无关。
你只需要知道什么是MVC,什么是REST…
在一个控制器中,您可以调用多个模型,也可以在多个控制器中调用一个模型。
在一个页面中,您可以从两个不同的API获取数据,这两个API可能来自不同的控制器,也可能来自不同服务器。例如:
- 在页面中,您直接从ellasticsearchAPI(比如esAPI1)获取数据
- 您正在从帆API(sAPI1)获取数据
- 您正在从其他帆API(sAPI2)获取数据
第二个答案
为了整洁,你们应该尽量保持控制器的清洁。因此,对于相同的sailsJS为您提供服务。您可以在其中编写要在多个控制器中使用的通用功能。
例如,请参阅代码
代码
这是控制器:
//TestController
module.exports = {
action1:function(req,res){
Model1.find().exec(function(err,data1){
if(err)
return res.negotiate(err);
res.ok(data1);
});
},
action2:function(req,res){
Model2.find().exec(function(err,data1){
if(err)
return res.negotiate(err);
res.ok(data2);
});
},
action3:function(req,res){
var hash=SomeService.getMeHashCode(req.query.text)
res.ok({hashedData:hash});
}
};
这就是服务。
//SomeService.js
module.exports = {
getMeHashCode:function(strinToBeHashed){
var hash=doSomeThingToHash(strinToBeHashed);
return hash;
}
};