【问题标题】:How to send data back to controller from model in Sails.js如何从 Sails.js 中的模型将数据发送回控制器
【发布时间】:2015-12-05 12:52:11
【问题描述】:

我在用户控制器中有 getUsers(),如下所示

getUsers: function(req, res){       
  var results = User.getUsers();        
  return res.send(results);
}

我正在调用用户模型的 getUsers() 方法。此方法的代码如下

getUsers: function(){
    User.find({}).exec(function findCB(err, found){       
       return found;
    });
}

现在我如何在控制器中获取这个结果(在本例中为“找到”)?这样我就可以使用响应对象将它发送到前端。

似乎这些函数调用是异步的..

【问题讨论】:

  • 至少有勇气张贴拒绝投票的理由。它可以帮助我们学习新的东西......
  • 与很多反对票一样 - 没有解释这是毫无意义的 - 赞成票,因为在我看来这是一个有效的问题。

标签: node.js model-view-controller sails.js


【解决方案1】:

您的控制器希望:

getUsers: function(req, res){       
                 User.getUsers(function (results) {
                    res.json(results);
                 });        
}

模型将如下:

getUsers: function(cb){
  User.find({}).exec(function(err, found){       
    if(err) // your error handling code 
    cb(found);
  });
}

cb是回调函数

  • 是的,“胖模型,瘦控制器”是遵循 MVC 的好方法

【讨论】:

  • 有一个胖模型,然后他们是一个臃肿的模型。为什么要创建模型已经拥有的模型方法并将该重复方法放置在控制器中而不是使用原始方法?同时你也没有通过这样做让你的控制器变得更瘦。您仍然需要调用模型上的方法。
  • 在模型中使用数据库交互查询的原因之一是代码的可重用性,也影响了查询优化,因此保留了MVC的概念。
  • 直接从控制器调用User.find({}) 仍然具有您提到的所有好处。该模型已经是您寻求的分离。您的答案只是将一个函数包装在模型内的另一个函数中,并告诉控制器使用它而不是已经存在的那个。它复制了代码,不会使控制器变得更小。如果模型已经有add(x, y){return x + y),然后你创建另一个函数,上面写着addNumbers(x,y){return add(x,y)},并且他应该从他的控制器而不是第一个调用第二个函数,这也是一样的。
  • 我明白你在说什么,但在模型中有 getUsers 功能的主要原因是: ** 我们已按照 MVC 模式的建议将模型交互代码放在模型中(因为模型管理数据)。 ** 您可以从任何控制器调用此函数,因此它支持可重用性。
【解决方案2】:

您是否有理由在模型中创建额外的方法。您可以直接访问所有用户。

getUsers: function(req, res){       
  User.find().exec(function(results){
   return res.ok(results); 
  })        
}

【讨论】:

  • 我知道控制器 cab 与数据库对话......但我读过很多作者,他们说你的模型(而不是控制器)应该与数据库对话。 “胖模型,瘦控制器”的概念也这么说。
  • 在这种情况下,User 是您正在与数据库对话的模型。
猜你喜欢
  • 1970-01-01
  • 2016-09-25
  • 2015-10-16
  • 2011-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-21
  • 1970-01-01
相关资源
最近更新 更多