0

我正在创建一个与 MongoDB 接口的自定义组件。我编写了一个连接到 MongoDB 的 CoffeeScript 文件,并将其存储在 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)

我的代码有问题,或者我用来运行代码的步骤有问题吗?

4

1 回答 1

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)

注意:加载程序会破坏'noflo-'包名称中的任何实例,因此需要考虑这一点。例如,名称'noflo-mongo'将变成 just 'mongo',因此在调用包的组件时,您将在 fbp 中编写DocReader(mongo/MongoBase)而不是DocReader(noflo-mongo/MongoBase)

于 2016-01-24T16:32:42.147 回答