【问题标题】:Meteor Fiber Issue?流星光纤问题?
【发布时间】:2013-12-05 10:25:47
【问题描述】:

我正在提取 CSV,将其解析为数组(效果很好)并尝试填充 Mongo 集合(失败)。

我在终端中收到以下错误:“错误:Meteor 代码必须始终在 Fiber 中运行。尝试使用 Meteor.bindEnvironment 包装您传递给非 Meteor 库的回调。”

这是我的 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]
                })

我正在尝试使用下面提到的 Meteor bindEnvironment。这是当前状态:

我正在使用用户触发的模板事件调用服务器方法:

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

【问题讨论】:

  • Meteor.bindEnvironment 能解决你的问题吗?
  • @parhelium,我认为这是正确的解决方案,但我似乎无法让它发挥作用。我将用我的简化代码修改上面的问题。
  • 我真正想做的就是从客户端获取文件 URL,将其转换为服务器上的数组,然后将其传递回客户端。应该很简单,但 CSV(第 3 方库)似乎给我带来了问题。

标签: javascript mongodb coffeescript meteor


【解决方案1】:

解决方案是 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);
        }
    )
);

【讨论】:

  • 哇!这就是Meteor.bindEnvironment 例程?我在文档中看不到它:/
  • 为什么不使用标准的Fiber 包装器?
  • Fiber 包装器很可能应该在这种情况下工作,因为The function returned from Meteor.bindEnvironment also automatically gets run in a Fiber. 但是我阅读了错误消息(使用 Meteor.bindEnvironment)并应用此解决方案,知道它可以工作 here。 @Tarang 解释 Meteor.bindEnvironment 的用法 here
  • Chris Mather 创建了截屏视频What is Meteor.bindEnvironment
猜你喜欢
  • 1970-01-01
  • 2014-07-30
  • 1970-01-01
  • 2013-10-04
  • 2012-12-01
  • 2015-08-22
  • 2015-08-16
  • 2013-06-22
  • 2015-09-22
相关资源
最近更新 更多