Sails从另一个控制器调用一个控制器

时间:2014-10-28 15:01:21

标签: node.js sails.js

我有两个控制器,SocketControllerProjectController
SocketController有方法getData(数据)
ProjectController有方法addProject(data)
我需要从getData()方法调用addProject() 我尝试使用sails.controllers.ProjectController.addProject(data),但我收到了以下错误:

无法找到未定义的方法addProject

我在Stack Overflow中搜索了使用services调用另一个控制器的其他方法,但这对我毫无帮助。有没有其他办法让这项工作?

2 个答案:

答案 0 :(得分:14)

控制器只是导出公共方法的Node模块。你可以require像其他任何东西一样。因此,假设您的方法使用module.exports正确公开,这将起作用:

/* ProjectController */

module.exports = {
  addProject: function(data) {
    // ...
  }
};

/* SocketController */

// Assuming ProjectController.js exists in the same directory (default for Sails)
var projectController = require('./ProjectController');

module.exports = {
  index: function(req, res) {
    // ...
    projectController.addProject(...);
  }
};

编辑:我将补充说,使用服务是保存常见功能的更好地方,例如您的示例。服务允许复杂的逻辑与控制器层分离,并轻松地由应用程序的其他区域重用。通常应保留控制器以处理来自客户端的HTTP请求,并将数据传递到服务或模型层以操作数据库。我相信Sails默认使服务全局化,因此您不必担心混淆require路径。

答案 1 :(得分:4)

也可以通过全局sails对象访问控制器函数,而无需使用require,但ProjectController中的函数将在以下位置找到:

sails.controllers.project.addProject

而不是

sails.controllers.ProjectController.addProject

无论如何,您可能需要考虑在服务或模型中共享功能,如前所述。