Начиная с noflo, запуская его из nodejs

Я получил простой пример с noflo. Но мне не повезло выяснить, как noflo должен работать с узлом и другим кодом.

Сначала у меня был этот файл fbp:

# In the graph we first need to define the nodes and the connections between them
Read(filesystem/ReadFile) OUT -> IN Display(core/Output)

# Start off the graph by sending a filename to the file reader
#'package.json' -> IN Read

Я старался: noflo.loadFile(filepath, nodedir, function(graph)

Это работает и выводит на консоль. Но если я опущу последнюю строку в FBP, это кормит package.json Параметр, я не нашел способ запустить график.

Есть ли где-нибудь руководство о том, как использовать noflo из кода nodejs, а не из командной строки?

1 ответ

Решение

Обычно компоненты NoFlo ничего не делают, пока не получат какой-либо ввод, в данном случае путь к файлу для чтения. Из документации по компонентам NoFlo:

Работающий экземпляр компонента в сети NoFlo называется процессом. Прежде чем процесс получит данные, он должен быть инертным, просто слушая свои входные порты. Процессы, которые должны начать что-то делать при запуске сети, должны быть запущены для этого, отправив им исходный информационный пакет.

Последняя строка в вашем определении графика.fbp отправляет строку package.json в компонент ReadFile.

Вы также можете сделать это программно после загрузки файла в сеть NoFlo:

noflo.loadFile(filepath, process.cwd(), function (network) {
  // Now we have access to the NoFlo network instance

  // Add Initial Information Packet programatically
  network.graph.addInitial(someFileToRead, 'Read', 'in');

  // Tell NoFlo to send the new IIPs
  network.sendInitials();
});

Экспортированные порты и подграфы

Теперь есть и более элегантный способ сделать это, выставив .fbp файл как график в ComponentLoader NoFlo, а затем взаимодействовать с ним, как если бы вы взаимодействовали с любым другим компонентом.

Чтобы сделать интересующие вас порты доступными извне, вам необходимо их экспортировать. В этом случае хотя бы порт ReadFile IN с графика. Это изменит определение вашей сети на:

# Export the filename port so it can be accessed from outside
INPORT=Read.IN:FILENAME

# The rest of the graph definition follows
Read(filesystem/ReadFile) OUT -> IN Display(core/Output)

(как это происходит, это именно тот пример, который я использовал на экспортируемых портах в определении языка.fbp)

Чтобы сделать ваш график доступным в качестве компонента, вам нужно сохранить его внутри вашего проекта Node.js (соглашение является graphs/ подкаталог) и зарегистрируйте его в package.json файл:

{
  "noflo": {
    "graphs": {
      "MyGraph": "graphs/MyGraph.fbp"
    }
  }
}

Теперь вы можете относиться к нему как к любому другому компоненту. Например:

var loader = new noflo.ComponentLoader(__dirname);
loader.load('MyGraph', function (instance) {
  // The instance is a running NoFlo subgraph with your graph definition

  // Create a socket and attach it to the exported port
  var filename = noflo.internalSocket.createSocket();
  instance.inPorts.filename.attach(filename);

  filename.send(someFileToRead);
  filename.disconnect();
});

Одна из причин, почему этот метод является предпочтительным, заключается в том, что вы можете не только использовать его для отправки IIP, но также для присоединения сокетов к экспортированным выходным портам и прослушивания событий на них. Таким образом, вы можете легко использовать любые графики NoFlo как асинхронные функции в вашем приложении JavaScript.

Другие вопросы по тегам