2015-09-23 5 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.json имеют name запись как "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).

 Смежные вопросы

  • Нет связанных вопросов^_^