Я пытаюсь создать фоновое обслуживание на подъеме Sails. Вот что я придумал до сих пор:Доступ к контроллеру 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
.
Любая идея, почему я не могу получить доступ к моему контроллеру из функции начальной загрузки?
Вы правы. После некоторых исследований я понял, что неверно истолковал, что означает «порождение». Он создает совершенно независимый процесс, который, таким образом, не может получить доступ к любому контроллеру, модели или чему-либо из мастер-процесса Sails. Жаль, однако, мне было бы здорово создать какой-то подпроцесс внутри Sails и наблюдать за его выходом асинхронно, как позволяет 'spawn'. Я предполагаю, что я собираюсь придерживаться классического сервиса, но, учитывая природу моего приложения, он немного неудовлетворен. – Bertrand
Вы можете использовать '.fork()' для создания дочернего процесса, который имеет канал связи для отправки/получения сообщений от родителя. Но я сомневаюсь, что вы достигнете того, что искали именно так. Работники обычно используются для длительных процессов, которые в противном случае блокировали бы поток Node от обработки событий (например, запросов); если вы вызываете родительский код изнутри дочернего процесса, вы все равно будете блокировать родительский поток. Если вам нужна только информация о состоянии от родителя, вы можете передать его в качестве аргументов командной строки для рабочего. – sgress454