我从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应用程序中的异步函数。