2015-09-23 30 views
0

我正在创建一个与MongoDB接口的自定义组件。我写了一个CoffeeScript文件,它只连接到MongoDB,并将其存储在noflo/components文件夹中。创建自定义组件并使用NoFlo运行

MongoBase.coffee

noflo = require "noflo" 
mongodb = require "mongodb" 
url = require "url" 

class exports.MongoBase extends noflo.Component 
    constructor: -> 
    super 
    @inPorts = 
     url: new noflo.Port() 

    @inPorts.url.on "data", (data) => 
     try 
     @parseConnectionString(data) 
     @MongoClient = mongodb.MongoClient; 
     @MongoClient.connect @serverUrl, (err, db) -> 
      if err 
      console.log("Error in connecting to MongoDB") 
      else 
      console.log("Connected to MongoDB") 
     catch error 
     console.log(error) 
    parseConnectionString: (connectionString) => 
    databaseUrl = try 
     url.parse(connectionString) 
    catch error 
     console.log(error) 
    [..., @serverUrl, @databaseName] = databaseUrl.split('/') 
    @serverUrl = "mongo://" + @serverUrl 

添加以下条目component.json

"MongoBase": "components/MongoBase.coffee" 

除此之外,我创建一个文件mongo.fbp检查组件的流动。该FBP文件具有下面的代码:

'mongodb://localhost:27017/test' -> url DocReader(MongoBase) 

在运行noflo mongo.fbp,我得到以下错误:

/home/saurabh/workspace/noflo/node_modules/fbp/lib/fbp.js:1628 
     edges.forEach(function (o, i) { 
      ^
TypeError: Object #<Object> has no method 'forEach' 
    at Object.parser.registerEdges (/home/saurabh/workspace/noflo/node_modules/fbp/lib/fbp.js:1628:15) 
    at peg$c25 (/home/saurabh/workspace/noflo/node_modules/fbp/lib/fbp.js:60:50) 
    at peg$parseline (/home/saurabh/workspace/noflo/node_modules/fbp/lib/fbp.js:749:30) 
    at peg$parsestart (/home/saurabh/workspace/noflo/node_modules/fbp/lib/fbp.js:282:12) 
    at Object.parse (/home/saurabh/workspace/noflo/node_modules/fbp/lib/fbp.js:1650:18) 
    at Object.exports.loadFBP (/home/saurabh/workspace/noflo/lib/Graph.js:1065:33) 
    at /home/saurabh/workspace/noflo/lib/Graph.js:1116:24 
    at fs.js:268:14 
    at Object.oncomplete (fs.js:107:15) 

有什么错我的代码,或我使用运行代码的步骤?

回答

0

您可能已经知道了这一点,因为自从您问了几个月后,我相信您需要在导出之前将getComponent()方法添加到您的课程中。

noflo = require "noflo" 
mongodb = require "mongodb" 
url = require "url" 

class MongoBase extends noflo.Component 
    constructor: -> 
    super 
    @inPorts = 
     url: new noflo.Port() 

    @inPorts.url.on "data", (data) => 
     try 
     @parseConnectionString(data) 
     @MongoClient = mongodb.MongoClient; 
     @MongoClient.connect @serverUrl, (err, db) -> 
      if err 
      console.log("Error in connecting to MongoDB") 
      else 
      console.log("Connected to MongoDB") 
     catch error 
     console.log(error) 
    parseConnectionString: (connectionString) => 
    databaseUrl = try 
     url.parse(connectionString) 
    catch error 
     console.log(error) 
    [..., @serverUrl, @databaseName] = databaseUrl.split('/') 
    @serverUrl = "mongo://" + @serverUrl 

MongoBase.getComponent = -> new MongoBase 
exports.MongoBase = MongoBase 

此外,在图形中的组件装载工作,你需要在指定包的组件的生命。如果你的package.json/component.jsonname进入像"name": "mongo-base"那么你必须在指定这个FBP图表,像这样:

'mongodb://localhost:27017/test' -> url DocReader(mongo-base/MongoBase) 

NB:装载机则会覆盖在包名称'noflo-'任何情况下,所以这需要加以考虑。例如。名称'noflo-mongo'将变成只有'mongo',因此在调用软件包的组件时,您需要在fbp DocReader(mongo/MongoBase)而不是DocReader(noflo-mongo/MongoBase)中写入。