Node.js 帆从另一个控制器调用一个控制器

Node.js 帆从另一个控制器调用一个控制器,node.js,sails.js,Node.js,Sails.js,我有两个控制器,SocketController和ProjectController SocketController具有方法getData(data) ProjectController有方法addProject(数据) 我需要从getData()方法调用addProject() 我尝试使用sails.controllers.ProjectController.addProject(data),但出现以下错误: 找不到未定义的addProject方法 我在中搜索了使用服务呼叫另一个控制器的替代

我有两个控制器,
SocketController
ProjectController

SocketController
具有方法getData(data)
ProjectController
有方法addProject(数据)
我需要从getData()方法调用addProject() 我尝试使用
sails.controllers.ProjectController.addProject(data)
,但出现以下错误:

找不到未定义的addProject方法


我在中搜索了使用
服务
呼叫另一个控制器的替代方法,但这对我没有帮助。还有其他方法可以完成这项工作吗?

控制器只是导出公共方法的节点模块。你可以像其他任何事情一样要求他们。因此,假设您的方法正确地公开在
模块.exports中,这将起作用:

/* ProjectController */

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


编辑:我要补充一点,使用服务是保持像您的示例一样的公共功能的更好地方。服务允许将复杂的逻辑与控制器层解耦,并轻松地被应用程序的其他区域重用。控制器通常应保留用于处理来自客户端的HTTP请求,并将数据传递给服务层或模型层以操作数据库。我相信,默认情况下,Sails还使服务成为全局服务,因此您不必担心混淆
require
路径。

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

sails.controllers.project.addProject

而不是

sails.controllers.ProjectController.addProject


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

不应该是模型吗?使用<代码>帆。您使用的是
sails generate api project
,并且名称ProjectController已由sails分配给您的控制器文件控制器在全局“sails”对象中可用,因此我不明白为什么您不能在示例中仅使用sails.controllers.project,而不使用require().sails.controllers(sails 1.x)。。。现在只有require方法有效。
/* SocketController */

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

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