我有一个简单的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
我试过了:noflo.loadFile(filepath, nodedir, function(graph)
这适用于打印到控制台。
但是,如果我省略fbp中的最后一行,即package.json
参数,我发现无法运行图表。
是否有关于如何从nodejs代码而不是命令行使用noflo的指南?
答案 0 :(得分:5)
通常NoFlo组件在收到某些输入之前不做任何事情,在这种情况下是要读取的文件路径。来自NoFlo component docs:
NoFlo网络中正在运行的组件实例称为进程。在进程收到数据之前,它应该 inert ,只是监听其输入端口。应该通过向网络发送初始信息包来触发在网络启动时需要开始执行某些操作的进程。
.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应用程序中的异步函数。