Можно ли экспортировать класс в файл node.js, который также имеет хуки IPC? - PullRequest
0 голосов
/ 28 февраля 2019

[Node.js v8.10.0]

Я радикально упрощаю этот пример для ясности.У меня есть 3 сценария: parent.js, first.js и second.js

parent.js:

'use strict';

const path = require('path');
const {fork} = require('child_process');

const firstScript = path.resolve('first.js');
const first = fork(firstScript);

const secondScript = path.resolve('second.js');
const second = fork(secondScript);

first.on('message', message => {
  console.log('parent received message from first: ' + message);
  second.send(message);
});

second.on('message', message => {
  console.log('parent received message from second: ' + message);
});

first.send('original message');

first.js:

'use strict';

class First {
}

process.on('message', async (message) => {
  console.log('first received message: ' + message);
  process.send(message);
});

module.exports = {First};

секунда.js:

'use strict';

const {First} = require('./first.js');

process.on('message', message => {
  console.log('second received message: ' + message);
  process.send(message);
});

Ожидаемый результат:

первое полученное сообщение: исходное сообщение

родительское полученное сообщение от первого: исходное сообщение

второе полученное сообщение: исходное сообщение

родительское полученное сообщение от второго: исходное сообщение

фактический вывод:

первое полученное сообщение: исходное сообщение

родительское сообщение получено первым: оригинальное сообщение

первое полученное сообщение: оригинальное сообщение

второе полученное сообщение: оригинальное сообщение

родительское сообщение получено от второго: оригинальное сообщение

родитель получил сообщение от second: original message

В этом примере первый класс не имеет смысла.Но это иллюстрирует проблему, которую я пытаюсь избежать.В частности, строка const {First} = require('./first.js'); в файле second.js наносит ущерб IPC (как показано фактическим результатом по сравнению с ожидаемым результатом).

В настоящее время я "решаю" эту проблему, перемещаяПервый класс в отдельный файл.Но мне интересно, возможно ли сохранить все в одном файле (т.е. все же сделать возможным экспорт класса в first.js, но не создавать хаос, связанный с IPC).

1 Ответ

0 голосов
/ 28 февраля 2019

Дело в том, что когда вы require сценарий, под капотом сценарий run и экспорт извлекается в конце.То, что вы видите, полностью логично - в основном это четыре процесса вместо одного, когда вы запускаете $ node parent.js

  1. Parent, созданный $ node parent.js
  2. Первый, созданный fork(firstScript)
  3. Второй, созданный fork(secondScript)
  4. другой Первый, созданный require('./first.js')

Скажите, нужно ли мне добавитьдерево процессов ascii art, отображающее обмен сообщениями и создание процесса, или, если все в порядке!

Ах, это имеет смысл!Но ... как я могу экспортировать файл, не выполняя части скрипта, которые создают перехватчики IPC?

Обычный шаблон проектирования в JavaScript (узел или сеть) имеет только Отключение файлов, кроме одного .Таким образом, все файлы только импортируют / экспортируют классы и константы, но есть только один главный файл , который фактически запускает всю программу, ссылаясь на весь интеллект в другом месте исходного кода.В основном это:

// hello.js
module.exports = () => console.log('hello world');
// main.js
const hello = require('./hello');
hello();

Всегда лучше учесть ваш код так, чтобы упростить вашу работу, но если вы не можете, вы всегда можете предотвратить запуск некоторого кода в зависимости от того, является ли сценарий требуется или , называемое , как объяснено здесь .В вашем случае, переписав first.js следующим образом:

'use strict';

class First {
}

// called only if invoked as script
if (require.main==module) {
  process.on('message', async (message) => {
    console.log('first received message: ' + message);
    process.send(message);
  });
}

module.exports = {First};

Дает ожидаемый результат, который вы описали при запуске node parent.js.

...