在异步回调中调用方法

时间:2015-09-06 05:46:39

标签: methods meteor

我在使用kafka-node包的项目中使用kafka ...

我已经介绍了一种方法,在其中我试图使用kafka模块,例如:

Meteor.methods
  kafka: (topic, message) ->
    if(Meteor.isServer)
      message = JSON.stringify(message)
      kafka = Meteor.npmRequire 'kafka-node'
      HighLevelProducer = kafka.HighLevelProducer
      Client = kafka.Client
      client = new Client
      producer = new HighLevelProducer(client)
      payloads =[{topic: topic, messages: [message]}]
      producer.on 'ready', ->
        producer.send payloads, (error,data) ->
          if not error
            HighLevelConsumer = kafka.HighLevelConsumer
            Client = kafka.Client
            client = new Client('localhost:2181')
            topics = [ { topic: topic } ]
            options =
              autoCommit: true
              fetchMaxWaitMs: 1000
              fetchMaxBytes: 1024 * 1024
            consumer = new HighLevelConsumer(client, topics, options)
            consumer.on 'message',(message) ->
              console.log message.value
              #Meteor.call 'saveMessage', message.value, (error,data) -> 

              return
            consumer.on 'error', (err) ->
              console.log 'error', err
              return
      producer.on 'error', (err) ->
        console.log 'error', err

一切都很好,直到我决定使用meteor.call并调用方法来保存该消息。 它给了我这个错误。

  

流星代码必须始终在光纤内运行。尝试包装回调   使用Meteor.bindEnvironment传递给非Meteor库

我尝试将其封装在Fiber中,使用Meteor.wrapAsync(),两者都没有帮助, 请伙计们帮助我,我很难解决这个问题......

1 个答案:

答案 0 :(得分:0)

如果您正在使用节点样式回调,则可以在回调周围使用Meteor.bindEnvironment。例如:

let Sockets = new Mongo.Collection('connections');

function createConnection (name) {
  check(name, String);
  let socket = net.connect(23, '192.168.1.3', Meteor.bindEnvironment(function () {
    Sockets.upsert({ name: name }, { $set: { status: 'connected' } });
  }));
}
相关问题