2013-11-21 110 views
0

我拉一个CSV,解析成一个数组(很好),并试图填充Mongo集合(失败)。流星光纤问题?

我在终端中出现以下错误:“错误:流星代码必须始终在光纤内运行,尝试使用Meteor.bindEnvironment传递给非流星库的回调。

这是我的js代码(服务器):

var order, orders, _i, _len; 

CSV().from(fileAddress).to.array(function(data) {}); 

orders = data; 

for (_i = 0, _len = orders.length; _i < _len; _i++) { 
    order = orders[_i]; 
    Orders.insert({ 
    clientId: order[0], 
    shipmentId: order[1], 
    orderId: order[2], 
    orderDate: order[3], 
    expectedDeliveryDate: order[4], 
    shipMethod: order[5], 
    customerName: order[6], 
    companyName: order[7], 
    address1: order[8], 
    address2: order[9], 
    city: order[10], 
    state: order[11], 
    zipCode: order[12], 
    country: order[13], 
    itemId: order[14], 
    quantity: order[15], 
    sku: order[16], 
    itemDescription: order[17], 
    productVariationDetails: order[18], 
    artfile: order[19], 
    customerMessage: order[20] 
    }); 
} 

如果你愿意的话,你可以看到CoffeeScript的还有:

CSV().from(fileAddress).to.array (data) -> 
     orders = data 
     for order in orders 
      Orders.insert({ 
       clientId: order[0], 
       shipmentId: order[1], 
       orderId: order[2], 
       orderDate: order[3], 
       expectedDeliveryDate: order[4], 
       shipMethod: order[5], 
       customerName: order[6], 
       companyName: order[7], 
       address1: order[8], 
       address2: order[9], 
       city: order[10], 
       state: order[11], 
       zipCode: order[12], 
       country: order[13], 
       itemId: order[14], 
       quantity: order[15], 
       sku: order[16], 
       itemDescription: order[17], 
       productVariationDetails: order[18], 
       artfile: order[19], 
       customerMessage: order[20] 
       }) 

我试图使用流星绑定环境如下所述。这是当前的状态:

我打电话使用用户的服务器方法所触发模板事件:

Template.upload.events 
    'click #runMethod':() -> 
     Meteor.call('csv2Array', Session.get("fileUrl"), (error, result) -> 
      console.log result[0]) 

在服务器上,方法如下:

Meteor.methods 
    'csv2Array': (fileUrl) -> 
     data = CSV().from(fileUrl).to.array Meteor.bindEnvironment((data) -> 
      console.log data[0], (error) -> 
       console.log "Error in bindEnvironment", error) 

当我运行该方法,我得到这个错误:

I2047-12:18:10.287(-8)? Exception while invoking method 'csv2Array' Error: onException must be supplied 
I2047-12:18:10.287(-8)?  at Object.Meteor.bindEnvironment (packages/meteor/dynamics_nodejs.js:65) 
I2047-12:18:10.288(-8)?  at Meteor.methods.csv2Array (./csv.coffee:33:39) 
I2047-12:18:10.288(-8)?  at maybeAuditArgumentChecks (packages/livedata/livedata_server.js:1356) 
I2047-12:18:10.288(-8)?  at packages/livedata/livedata_server.js:541 
I2047-12:18:10.288(-8)?  at _.extend.withValue (packages/meteor/dynamics_nodejs.js:35) 
I2047-12:18:10.288(-8)?  at packages/livedata/livedata_server.js:540 
I2047-12:18:10.289(-8)?  at _.extend.withValue (packages/meteor/dynamics_nodejs.js:35) 
I2047-12:18:10.289(-8)?  at _.extend.protocol_handlers.method (packages/livedata/livedata_server.js:539) 
I2047-12:18:10.289(-8)?  at packages/livedata/livedata_server.js:439 
+0

'Meteor.bindEnvironment'是否可以解决您的问题? –

+0

@parhelium,我认为这是正确的解决方案,但我似乎无法让它工作。我将用我的简化代码修改上面的问题。 – ppedrazzi

+0

我真正想要做的是从客户端获取文件URL,将其转换为服务器上的阵列,然后将其传回给客户端。应该是直截了当的,但CSV(第三方库)似乎对我造成了问题。 – ppedrazzi

回答

0

解决方案是Meteor.bindEnvironment:

var order, orders, _i, _len; 

CSV().from(fileAddress).to.array(
    Meteor.bindEnvironment(
     function(data) { 
      orders = data; 
      for (_i = 0, _len = orders.length; _i < _len; _i++) { 
       order = orders[_i]; 
       Orders.insert({ 
       clientId: order[0], 
       //... 
       customerMessage: order[20] 
       }) 
      } 
     }, 
     function(error) { 
      console.log('Error in bindEnvironment:', error); 
     } 
    ) 
); 
+0

哇!那就是这个'Meteor.bindEnvironment'例程?我无法在文档中看到它:/ –

+0

为什么不使用标准的'Fiber'包装? –

+0

在这种情况下,'Fiber'封装器很可能会工作,因为'Meteor.bindEnvironment返回的函数也会自动运行在Fiber中。'但是,我读取错误消息(使用Meteor.bindEnvironment)并应用此解决方案它工作[这里](http://stackoverflow.com/questions/19314200/using-node-csv-and-meteor-file-to-import-csv-into-a-collection)。 @Tarang解释Meteor.bindEnvironment的使用[这里](http://stackoverflow.com/questions/19994951/whats-going-on-with-meteor-and-fibers-bindenvironment) –