我从noflo运行了一个简单的noflo示例。但是我没有办法弄清楚noflo应该如何与 Node 和其他代码一起工作。

一开始我有这个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参数,那么我找不到运行该图的方法。

是否有指南关于如何从nodejs代码而不是从命令行使用noflo?

最佳答案

通常,NoFlo组件在接收到一些输入(在这种情况下为要读取的文件路径)之前不执行任何操作。从NoFlo component docs:



.fbp graph definition的最后一行将字符串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文件作为图形公开在NoFlo的ComponentLoader中,然后在与其他任何组件交互时与之交互。

要从外部使您感兴趣的端口可用,您需要将其导出。在这种情况下,至少应从图中读取文件的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 language definition中的导出端口上使用的示例)

为了使图形作为组件可用,您需要将其保存到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应用程序中的异步函数。

10-06 14:15