Meteor / mongoDb查找和更新

时间:2016-10-12 11:55:15

标签: javascript mongodb meteor

我刚学习Meteor,我做了一个小应用程序,但我在服务器端遇到find()update()集合有问题

例如:

if (Meteor.isServer) {

    function getCollection1(){
        return collection_1.find({}).fetch({});
    }
    ....
    Meteor.methods({

        start: function(id) {

            datas = getCollection1();
            Collection2.update({_id:id}, {$set: {datas: datas}}); //sometimes it's ok(3/4)

        }
        ...

    }

或者当我等待时,我有一个错误

if (Meteor.isServer) {

    async function getCollection1(){
        return await collection_1.find({}).fetch({});
    }
    ....
    Meteor.methods({

        start: function(id) {

            getCollection1().then(function(datas){
                Rooms.update({_id: id}, {$set: {datas: datas}},function(err){
                    console.log(err);//error: Meteor code must always run within a fiber
                });
            });
        }
        ...

    }

我做错了什么?

修改

它似乎与Fiber()

配合得很好
if (Meteor.isServer) {
    Fiber = Npm.require('fibers')     
        function getCollection1(){
            return collection1.find({}).fetch({});  
        }
        function setCollection2(id){
        Fiber(function() { 
            datas = getCollection1();               
                collection2.update({_id: id}, {$set: {datas: datas}},function(err){
                    console.log(err);
                });
        }).run();
        }
        ....
        Meteor.methods({

            start: function(id) {

                setCollection2(id);

            }
        ...

        }  

2 个答案:

答案 0 :(得分:0)

使用async / await版本,您不需要使用光纤。相反,你可以使用这个Meteor功能:Meteor.bindEnvironment使其工作:

// ...     
getCollection1().then(Meteor.bindEnvironment(function(datas){
  Rooms.update(// ...);
}));
// ...

有关更易理解的解释,请参阅此视频:

What is Meteor.bindEnvironment?

答案 1 :(得分:-1)

根据您提供的代码,我的猜测是第一个例子" Collection2.update"在GetCollection1()完成之前发生。如果情况确实如此,那么在您订阅该集合时,在客户端,请确保有一种方法来等待"订阅完成。

例如在客户端这样的东西,其中" start()"被称为......

const handle = Meteor.subscribe( 'collection_1' );
  if ( handle.ready() ) {
    Meteor.call('start');   
} else {
    const allusers = Meteor.users.find().fetch();   
    onData( null, {allusers} );
}

同样,这是我最好的猜测,因为您没有在第一个代码块中发布您收到的错误,而且我无法说出您尝试实施此错误的第二个错误。