从noflo开始,从nodejs运行它

Mad*_*d0g 3 node.js noflo

从noflo运行了一个简单的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
Run Code Online (Sandbox Code Playgroud)

我试过了: noflo.loadFile(filepath, nodedir, function(graph)

这适用于打印到控制台.但是,如果我省略了fbp中的最后一行,它提供package.json参数,我发现无法运行图形.

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

ber*_*gie 5

通常,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();
});
Run Code Online (Sandbox Code Playgroud)

导出的端口和子图

现在,通过.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)
Run Code Online (Sandbox Code Playgroud)

(实际上,这正是我在.fbp语言定义中导出端口上使用的示例)

要使您的图形作为组件可用,您需要将其保存到Node.js项目(约定是graphs/子目录)中并将其注册到package.json文件中:

{
  "noflo": {
    "graphs": {
      "MyGraph": "graphs/MyGraph.fbp"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

现在您可以将其视为任何其他组件.例如:

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();
});
Run Code Online (Sandbox Code Playgroud)

这是首选方法的一个原因是您不仅可以使用它来发送IIP,还可以将套接字连接到导出的输出端口并监听它们上的事件.这样,您可以轻松地将任何NoFlo图形用作JavaScript应用程序中的异步函数.