我在使用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(),两者都没有帮助, 请伙计们帮助我,我很难解决这个问题......
答案 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' } });
}));
}