2015-09-23 31 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)中寫入。