0

Я пытаюсь создать фоновое обслуживание на подъеме 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.

Любая идея, почему я не могу получить доступ к моему контроллеру из функции начальной загрузки?

ответ

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

Вы правы. После некоторых исследований я понял, что неверно истолковал, что означает «порождение». Он создает совершенно независимый процесс, который, таким образом, не может получить доступ к любому контроллеру, модели или чему-либо из мастер-процесса Sails. Жаль, однако, мне было бы здорово создать какой-то подпроцесс внутри Sails и наблюдать за его выходом асинхронно, как позволяет 'spawn'. Я предполагаю, что я собираюсь придерживаться классического сервиса, но, учитывая природу моего приложения, он немного неудовлетворен. – Bertrand

+0

Вы можете использовать '.fork()' для создания дочернего процесса, который имеет канал связи для отправки/получения сообщений от родителя. Но я сомневаюсь, что вы достигнете того, что искали именно так. Работники обычно используются для длительных процессов, которые в противном случае блокировали бы поток Node от обработки событий (например, запросов); если вы вызываете родительский код изнутри дочернего процесса, вы все равно будете блокировать родительский поток. Если вам нужна только информация о состоянии от родителя, вы можете передать его в качестве аргументов командной строки для рабочего. – sgress454

Смежные вопросы