2013-11-21 5 views
0

Я тяну CSV, разбираю его в массив (отлично работает) и пытаясь заполнить Монгольскую коллекцию (не получается).Проблема с метеорным волокном?

Я получаю следующую ошибку в терминале: «Ошибка: код метеора должен всегда запускаться внутри волокна. Попробуйте обменивать обратные вызовы, которые вы передаете в библиотеки, не относящиеся к Meteor, с помощью Meteor.bindEnvironment».

Вот мой JS код (Server):

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) –

Смежные вопросы