【问题标题】:Can't wait without a fiber when calling Meteor.users.findOne调用 Meteor.users.findOne 时不能等待没有光纤
【发布时间】:2015-09-30 23:33:22
【问题描述】:

我正在使用来自 RabbitMQ 的消息,然后想使用 raix-push 插件向 APNS/GSM 发送推送通知。我将 RabbitMQ 与 Meteor 集成,但是当我尝试查询用户记录以获取他们的 _id(raix-push 所需)时,它给出了以下异常:

W20150930-16:03:53.929(-7)? (STDERR) Error: [Error: Can't wait without a fiber]
W20150930-16:03:53.929(-7)? (STDERR)     at Connection.<anonymous> (packages/jakobloekke_rabbitmq/packages/jakobloekke_rabbitmq.js:20:1)
W20150930-16:03:53.929(-7)? (STDERR)     at Connection.emit (events.js:117:20)
W20150930-16:03:53.929(-7)? (STDERR)     at Connection.<anonymous> (/Users/lsacco/.meteor/packages/jakobloekke_rabbitmq/.0.0.2.1lqodho++os+web.browser+web.cordova/npm/node_modules/amqp/lib/connection.js:176:14)
W20150930-16:03:53.930(-7)? (STDERR)     at Connection.emit (events.js:95:17)
W20150930-16:03:53.930(-7)? (STDERR)     at CleartextStream.emit (events.js:95:17)
W20150930-16:03:53.933(-7)? (STDERR)     at CleartextStream.<anonymous> (_stream_readable.js:765:14)
W20150930-16:03:53.933(-7)? (STDERR)     at CleartextStream.emit (events.js:92:17)
W20150930-16:03:53.933(-7)? (STDERR)     at emitReadable_ (_stream_readable.js:427:10)
W20150930-16:03:53.933(-7)? (STDERR)     at _stream_readable.js:420:7
W20150930-16:03:53.933(-7)? (STDERR)     at process._tickCallback (node.js:448:13)

我尝试了许多不同的方法,例如包装为 Fiber,使用 Meteor.bindEnivornment 和提到的方法 here。知道我在这里缺少什么吗?

    RabbitMQ.connection.on('ready', function () {
        RabbitMQ.connection.queue('ma.services.gapns', {'durable': true, 'autoDelete': false, closeChannelOnUnsubscribe: true }, function (queue) {
            try 
                queue.bind('ma.integration.exchange', 'gapns');
                queue.subscribe(function (msg) {
                    var data = {};
                    if (msg.content) {
                        data = msg.content;
                    }
                    var uid = data.uid,
                        system = data.system,
                        count = data.count;
                    if (uid && system && count >= 0) {
                        var user = getUser(uid);

                        Push.send({
                            from: 'push',
                            title: 'Hub Notification',
                            text: system + " request(s) to approve",
                            badge: count,
                            sound: 'ping.aiff',
                            query: {
                                userId: user._id
                            }
                        });
                    }

                });
            }
            catch (e) {
                logger.error("Exception occurred while processing push notifications: " + e);
            }
        });
    });

function getUser(uid) {
    var Future  = Npm.require('fibers/future');
    var future = new Future();
    Meteor.users.findOne({username: uid}, {}, function(err, result) {
        if (err) {
            future.throw(err);
        }

        future.return(result);
    });
    return future.wait();
}

【问题讨论】:

  • findOne 需要在光纤中调用。您是否尝试过使用 wrapAsync?
  • 如果你的意思是Meteor.wrapAsync(getUser(uid)) 或包装Meteor.users.findOne(),那么是的。产生相同的结果。

标签: meteor


【解决方案1】:

我必须将Meteor.bindEnvironment() 添加到所有三个回调(连接就绪、连接队列和队列订阅)中才能正常工作。这让我望而却步,因为我认为如果顶级函数有它,我会没事的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-04
    • 2015-12-21
    • 2016-10-25
    • 2015-09-22
    • 2013-08-23
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多