Начиная с 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.