JSON不会插入Meteor Collection(即使使用Fiber或bindEnvironment)

时间:2014-11-13 04:38:48

标签: meteor coffeescript fiber

我意识到已经讨论了类似的主题,我已经浏览了所有这些主题并尝试模拟解决方案大约4个小时,但似乎没有一个解决问题。我不会发布这个,因为我已经用尽了任何可能找到的解决方案。

我正在尝试将大型csv转换为JSON,然后在转换后将其插入我的Meteor集合中。

以下是使用Meteor.bindElement方法的代码:

if Meteor.isServer
    @Fiber = Meteor.npmRequire("fibers")
    Meteor.startup ->
    #Converter Class
         if Data.find().count() is 0
             Converter = Meteor.npmRequire('csvtojson').core.Converter
             fs = Meteor.npmRequire('fs')
             csvFileName = '/Path/To/My/File.csv'
             fileStream = fs.createReadStream(csvFileName)
             #new converter instance
             csvConverter = new Converter(constructResult: true)
             #end_parsed will be emitted once parsing finished
             csvConverter.on "end_parsed", (jsonObj) ->
                 console.log jsonObj
                 boundFunction = Meteor.bindEnvironment(->
                     Data.insert jsonObj
                     return
                 , (e) ->
                      throw e
                      return
                 )

                 insertToDB boundFunction
                 #read from file
             fileStream.pipe csvConverter
         return

解析后我能够正确记录JSON,但是当我尝试将它添加到集合中时:

csvConverter.on "end_parsed", (jsonObj) ->
    console.log jsonObj
    Data.insert jsonObj

我收到错误:

throw new Error("Meteor code must always run within a Fiber. " +          
W20141112-20:08:44.306(-8)? (STDERR)           ^
W20141112-20:08:44.306(-8)? (STDERR) Error: Meteor code must always run within a Fiber. Try wrapping callbacks that you pass to non-Meteor libraries with Meteor.bindEnvironment.
W20141112-20:08:44.306(-8)? (STDERR)     at Object.Meteor._nodeCodeMustBeInFiber (packages/meteor/dynamics_nodejs.js:9)
W20141112-20:08:44.306(-8)? (STDERR)     at _.extend.get  (packages/meteor/dynamics_nodejs.js:21)
W20141112-20:08:44.306(-8)? (STDERR)     at Object.DDP.randomStream (packages/ddp/random_stream.js:69)
W20141112-20:08:44.306(-8)? (STDERR)     at self._makeNewID (packages/mongo/collection.js:72)
W20141112-20:08:44.306(-8)? (STDERR)     at Mongo.Collection.(anonymous function) [as insert] (packages/mongo/collection.js:485)
W20141112-20:08:44.307(-8)? (STDERR)     at csvAdv.<anonymous> (server/startup.coffee:16:13)
W20141112-20:08:44.307(-8)? (STDERR)     at csvAdv.emit (events.js:95:17)
W20141112-20:08:44.307(-8)? (STDERR)     at csvAdv.<anonymous> (/Users/samuel_chordas/CurrentClasses/CSCI477a/JPL/JataTwo/packages/npm-container/.build.npm-container/npm/node_modules/csvtojson/libs/core/init_onend.js:9:10)
W20141112-20:08:44.307(-8)? (STDERR)     at csvAdv.emit (events.js:117:20)
W20141112-20:08:44.307(-8)? (STDERR)     at _stream_readable.js:929:16
=> Exited with code: 8

我可以通过使用以下代码将函数包装在光纤中来解决这个问题,但它不会写入我的集合:

if Meteor.isServer
    @Fiber = Meteor.npmRequire("fibers")
    Meteor.startup ->
    #Converter Class
        if Data.find().count() is 0
            Converter = Meteor.npmRequire('csvtojson').core.Converter
            fs = Meteor.npmRequire('fs')
            csvFileName = '/Path/To/My/File.csv'
            fileStream = fs.createReadStream(csvFileName)
            #new converter instance
            csvConverter = new Converter(constructResult: true)
            #end_parsed will be emitted once parsing finished
            csvConverter.on "end_parsed", (jsonObj) ->
                Fiber ->
                    Data.insert jsonObj
                return
            fileStream.pipe csvConverter
        return

所以我尝试使用第一个代码块中显示的bindEnvironment,导致相同的“错误”(“Meteor代码必须始终在光纤内运行”错误。

这是我的/ lib文件夹中的集合:

@Data = new Mongo.Collection 'data'

我是Meteor Javascript和Coffescript的新手,所以任何反馈都会受到赞赏。

另外我想补充一点,我不能让.run()在Fiber上工作。

1 个答案:

答案 0 :(得分:0)

尝试在boundFunction事件处理程序之外移动end_parsed的定义。

boundFunction = Meteor.bindEnvironment((jsonObj) ->
  Data.insert jsonObj
  return
, (e) ->
  throw e
)

csvConverter.on "end_parsed", (jsonObj) ->
  console.log jsonObj
  boundFunction jsonObj
  return

我怀疑“Meteor代码必须始终在光纤内运行。”错误不是来自Data.insert,而是来自Meteor.bindEnvironment本身。 Meteor.bindEnvironment

  • 从“Meteor上下文”内部调用
  • 采取功能
  • 将该函数绑定到从
  • 调用bindEnvironment的相同“Meteor上下文”

在您的实施中,当您致电bindEnvironment时,“Meteor上下文”已经丢失,因此bindEnvironment无法提供任何帮助。