создание пользовательских компонентов и запуск с NoFlo

Я создаю пользовательский компонент, который взаимодействует с MongoDB. Я написал файл CoffeeScript, который просто подключается к MongoDB, и сохранил его в папке noflo/components.

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)

Что-то не так с моим кодом или шагами, которые я использую для запуска кода?


person Saurabh Sood    schedule 23.09.2015    source источник


Ответы (1)


Возможно, вы уже поняли это, так как прошло несколько месяцев с тех пор, как вы спросили, но я считаю, что вам нужно добавить метод 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)

Примечание. Загрузчик стирает любые экземпляры 'noflo-' в имени пакета, так что это нужно учитывать. Например. имя 'noflo-mongo' превратится просто в 'mongo', поэтому при вызове компонентов пакета вы должны написать в fbp DocReader(mongo/MongoBase), а не DocReader(noflo-mongo/MongoBase).

person Joshua Skrzypek    schedule 24.01.2016