流星方法的bug。收集更新后未设置对象

时间:2016-01-15 11:40:54

标签: mongodb meteor database

在一个Meteor方法中更新多个集合时,我有一个非常奇怪的错误(?)。

我设置了一个包含方法参数的对象,然后将其推送到三个不同集合中的数组。我第一次这样做,它可以工作,但之后对象是一个空对象。这似乎很奇怪!

该方法只被调用一次,无论我收集哪个顺序,都会发生同样的情况。

myMethod(_id, _cId, _uId, _log, _time) {
    console.log('method called'); // only logs once

    let _obj = {
        id : _id,
        log : _log,
        time : _time,
        user : _uId
    };

    console.log(_obj); // the object as expected

    Site.CollectionOne.update(_id, {$push : {"logs" : _obj }});

    console.log(_reaction, _id, _cId, _uId, _log, _time); // {} "theID" "theCID" "theUID" "the log message" 1234567890. The object has been emptied.

    Site.CollectionTwo.update(_cId, {$push : {"logs" : _obj }});
    Meteor.users.update(_uId, {$push : {"logs" : _obj }});
},

客户端和服务器上的日志相同。

1 个答案:

答案 0 :(得分:1)

如果将对象而不是文字传递给JS函数,则它将通过引用而不是值传递。因此,如果update对您传递的对象执行任何操作(如图所示),您还会在调用函数中看到这些更改,因为它实际上是更改的对象。< / p>

通过使用_.extend(或Object.assign),您可以创建要传递给函数的对象的副本,这样如果它发生变异并不重要。例如:

Site.CollectionOne.update(_id, {$push : {"logs" : _.extend({}, _obj) }});