我意识到已经讨论了类似的主题,我已经浏览了所有这些主题并尝试模拟解决方案大约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上工作。
答案 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
bindEnvironment
的相同“Meteor上下文”
在您的实施中,当您致电bindEnvironment
时,“Meteor上下文”已经丢失,因此bindEnvironment
无法提供任何帮助。