2013-11-21 141 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) –