Javascript 从衍生进程访问Sails控制器

Javascript 从衍生进程访问Sails控制器,javascript,node.js,model-view-controller,sails.js,bootstrapping,Javascript,Node.js,Model View Controller,Sails.js,Bootstrapping,我正试图在帆船升空时生成一个后台服务。 以下是我到目前为止的想法: config/bootstrap.js: module.exports.bootstrap = function(cb) { sails.on('lifted', function() { var spawn = require('child_process').spawn; var worker = spawn('node', ['./worker.js']); });

我正试图在帆船升空时生成一个后台服务。 以下是我到目前为止的想法:

config/bootstrap.js

module.exports.bootstrap = function(cb) {

    sails.on('lifted', function() {
        var spawn = require('child_process').spawn;
        var worker = spawn('node', ['./worker.js']);
    });

    cb();

};
worker.js

var sails = require('sails');

sails.controllers.MyController.myFunction(null, function(data) {
    console.log(data);
});
当我扬帆时,我得到以下错误:
无法读取未定义的属性“MyController”

我尝试在没有
require('sails')
的情况下,也没有在我的控制器名称前面添加
sails.controllers
,但随后它抛出了我
MyController未定义


知道我为什么不能从引导功能访问控制器吗?

您需要加载或提升Sails应用程序才能访问控制器、模型等。有关更多详细信息,请参阅和。所以它应该是这样的:

var sails = require('sails');
sails.load(function(err, sails) {
   if (err) {
     // handle error and exit process
   }
   // sails is now fully loaded
   sails.controllers.my.myFunction(null, function(data) {
      console.log(data);
   }
});

另外,在请求上下文之外运行控制器代码也很奇怪。您可能应该将该代码重构为一个。正如上面@elssar所指出的,控制器标识是小写的,“控制器”部分被删除。

您需要加载或提升Sails应用程序,以便能够访问控制器、模型等。有关更多详细信息,请参阅和。所以它应该是这样的:

var sails = require('sails');
sails.load(function(err, sails) {
   if (err) {
     // handle error and exit process
   }
   // sails is now fully loaded
   sails.controllers.my.myFunction(null, function(data) {
      console.log(data);
   }
});

另外,在请求上下文之外运行控制器代码也很奇怪。您可能应该将该代码重构为一个。正如上面@elssar所指出的,控制器标识是小写的,“控制器”部分被删除。

你说得对。经过一些研究,我意识到我误解了
spawn
的目的。它创建了一个完全独立的进程,因此无法从Sails的主进程访问任何控制器、模型或任何东西。不过,很遗憾,如果我能够在Sails中创建一种子进程,并像
spawn
允许的那样异步地查看其输出,那就太好了。我想我会坚持使用经典服务,但考虑到我的应用程序的性质,它有点不适应。您可以使用
.fork()
生成一个子进程,该子进程具有用于从父进程发送/接收消息的通信通道。但我怀疑你能通过这种方式实现你所期望的。worker通常用于长时间运行的进程,否则会阻止节点线程处理事件(如请求);如果从子进程内部调用父代码,那么仍然会阻塞父线程。如果您所需要的只是来自父级的一些状态信息,那么您可以将其作为命令行参数传递给工作者。您是对的。经过一些研究,我意识到我误解了
spawn
的目的。它创建了一个完全独立的进程,因此无法从Sails的主进程访问任何控制器、模型或任何东西。不过,很遗憾,如果我能够在Sails中创建一种子进程,并像
spawn
允许的那样异步地查看其输出,那就太好了。我想我会坚持使用经典服务,但考虑到我的应用程序的性质,它有点不适应。您可以使用
.fork()
生成一个子进程,该子进程具有用于从父进程发送/接收消息的通信通道。但我怀疑你能通过这种方式实现你所期望的。worker通常用于长时间运行的进程,否则会阻止节点线程处理事件(如请求);如果从子进程内部调用父代码,那么仍然会阻塞父线程。如果您所需要的只是来自父级的一些状态信息,那么可以将其作为命令行参数传递给工作者。