Node.js ответ на ответвление дочернего процесса - невозможно установить заголовки после их отправки клиенту - PullRequest
0 голосов
/ 04 февраля 2019

ситуация: есть функция, которая выполняет дорогостоящую операцию, такую ​​как выборка большого запроса из mongodb, а затем выполняет большой анализ и анализ ответа.Я разгрузил эту дорогостоящую операцию на дочернюю ветку процесса и ожидаю выполнения рабочего перед отправкой ответа, чтобы не блокировать основной цикл событий.

текущая реализация: у меня есть конечная точка API GET {{backend}}/api/missionHistory/flightSummary?days=90&token={{token}}

код точки входа API:

missionReports.js

const cp = require('child_process');
//if reportChild is initailzed here, "Cant send headers after they were sent"
const reportChild = cp.fork('workers/reportWorker.js'); 

exports.flightSummary = function (req, res) {
    let request = req.query;

    // if initialized here, there is no error. 
    const reportChild = cp.fork('workers/reportWorker.js');

    logger.debug(search_query);

    let payload = {'task':'flight_summary', 'search_params': search_query};
    reportChild.send(payload);

    reportChild.on('message', function (msg) {
       logger.info(msg);

       if (msg.worker_status === 'completed')
       {
           return res.json(msg.data);
       }


    });
};

рабочий код: reportWorker.js

process.on('message', function (msg) {
    process.send({'worker_status': 'started'});
    console.log(msg);

   switch(msg.task)
    {
        case 'flight_summary':
            findFlightHours(msg.search_params,function (response) {
                logger.info('completed')
                process.send({'worker_status': 'completed', 'data':response});
            })
        break;
    }


});

сценарий 1: reportChild (fork) инициализируется в начале определений модуля.вызов API работает один раз и возвращает правильные данные.при втором вызове происходит сбой с невозможностью отправки заголовков после их отправки.Я прошел по коду, и он определенно отправляет его только один раз за вызов API.

сценарий 2: если я инициализирую reportChild внутри определения API, он работает идеально каждый раз.Это почему?Разве дочерний процесс не уничтожен, если он не переопределен?Это стандартная реализация дочерних процессов?

Это моя первая попытка создания потока в файле node.js, я пытаюсь переместить дорогостоящие операции из цикла основного события на других работников.Дайте мне знать, что является лучшей практикой в ​​этой ситуации.Благодаря.

...