Как программно дождаться, пока процесс запустит конечную точку

#node.js #process #timeout #delay

#node.js #процесс #тайм-аут #задержка

Вопрос:

Я создал небольшой пример приложения в node.js с модульными тестами и приемочными тестами здесь

Как модульные, так и приемочные тесты выполняются внутри процесса mocha. Приемочные тесты начинаются с разветвления процесса и в основном запуска сервера по методу before(). метод after() останавливает процесс и

 before((initialized) => {
  console.log('before script');
  serverProcess = child_process.fork('server.js');
  serverProcess.on('close', function (code) {  
  console.log('child process exited with code '   code);  
});
setTimeout(() => {
  console.log('1s elapsed');
  initialized();
}, 1000);
  

Код без каких-либо задержек работает на моем локальном gitlab-runner, однако на сервере это не всегда так, поэтому я добавил задержку — подождите некоторое время, пока сервер не запустится.
Опытным путем я обнаружил, что 1s достаточно, а .5s — нет.
Тем не менее, я хотел бы знать, что я должен сделать, чтобы убедиться, что сервер работает.

 Are there any solutions to run server, execute the tests and shutdown the server that works on Linux, Windows, docker and outside of it?
  

Ответ №1:

Есть хорошая справка о том, как взаимодействовать между процессами fork.

Идея будет заключаться в том, чтобы отправить сообщение от ребенка, говорящее его папе (я готов!). Тогда папа продолжит свою работу.

Пример :

 before((initialized) => {
  serverProcess = child_process.fork('server.js');

  serverProcess.on('close', function(code) {
    console.log('child process exited with code '   code);
  });

  serverProcess.on('close', function(code) {
    console.log('child process exited with code '   code);
  });

  // We add a backup plan. If it takes too long to launch, throw
  const timeout = setTimeout(() => {
    initialized(new Error('tiemout');
  }, 30000);

  // Cait for the child to send a message to us
  serverProcess.on('message', function(str) {
    if (str === 'init done') {
      clearTimeout(timeout);

      // server.js got successfully initialized
      initialized();
    }
  });
});
  

 // To add inside of your server.js listen
if (process.send) {
  process.send("init done");
}