0

我試圖在Sails升降機上產生後臺服務。 下面是我想出迄今:從衍生過程訪問帆控制器

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); 
}); 

當我舉起帆,我得到以下錯誤:Cannot read property 'MyController' of undefined

我在沒有require('sails')的情況下試過,沒有在我的控制器名稱前加上sails.controllers,但是後來它拋出MyController is not defined

任何想法爲什麼我不能從引導功能訪問我的控制器?

回答

2

您需要加載或提升Sails應用程序才能訪問控制器,型號等。有關更多詳細信息,請參閱sails.load()sails.lift()。所以它會是這樣的:

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); 
    } 
}); 

注意,在請求的上下文之外運行控制器代碼也很奇怪。您可能應該將該代碼重構爲service。正如上面的@elssar筆記所示,控制器標識是小寫的,「控制器」部分被刪除。

+0

你說得對。經過一番研究後,我意識到我錯誤地解釋了'spawn'意味着什麼。它創建了一個完全獨立的過程,因此無法訪問Sails主進程中的任何控制器,模型或任何東西。我很高興能夠在Sails中創建一個子進程,並像'spawn'一樣異步地監視它的輸出。 我想我會堅持一個經典的服務,但考慮到我的應用程序的性質,它有點沒有適應。 – Bertrand

+0

您可以使用'.fork()'產生一個子進程,該子進程具有用於從父進程發送/接收消息的通信通道。但是我懷疑你會以這種方式實現你正在尋找的東西。工作人員通常用於長時間運行的進程,否則會阻止Node線程處理事件(如請求);如果你從子進程中調用父代碼,那麼你仍然會阻塞父線程。如果您只需要父級的某些狀態信息,則可以將其作爲命令行參數傳遞給worker。 – sgress454