Meteor.js中的数据库“扑动”?

时间:2013-12-20 10:08:51

标签: mongodb meteor database

正如Abigail Watson在this谷歌小组讨论中解释的那样,数据库震荡是Meteor.js中出现的一种现象,但没有详细说明。似乎已经出现package来解决这个问题。

所以,我的问题是,Meteor.js中的“数据库抖动”是什么,以及在检查时如何影响我Deps.autorun()中的Meteor.user()?

编辑:我添加了一个令我头疼的代码示例,我认为这是由“数据库抖动”引起的。当用户登录时,Meteor.user()中的console.logs通常运行几次,与logout console.logs相同。在'userLoggedOut'中我正在重置Meteor.user()。profile.setAvailable布尔值,有时这会将我引入永久循环,因为if(Meteor.user())然后再次运行。这当然可能是我做错了......:)

使用此代码时遇到此问题:

var lastUserId;
Deps.autorun(function () {
    if(Meteor.user()) {
        lastUserId = Meteor.user()._id;
        console.log("USER LOGGED IN WITH USER ID", lastUserId);
        if (Meteor.user().profile.setAvailable) {
            Meteor.call('setAvailable',
            {
                options: Meteor.user()
                               .profile
                               .someDataThatShouldBeSetAvailable
            });
        }
        if (Meteor.user().profile.forceLogOut) {
            Meteor.call('resetForceLogOut',
                {
                    userId: Meteor.user()._id
                });
            window.location.reload();
        }
    } else {
        if (lastUserId) {
            console.log("LOGOUT: We should do something
                with this id", lastUserId);
            Meteor.call('userLoggedOut',
                {
                    userId: lastUserId
                });
        } else {
            console.log("We don't have any lastUserId, the page 
                has probably been refreshed");
        }
    }
});

1 个答案:

答案 0 :(得分:2)

这是众所周知的,因为用户似乎是分阶段发送的。最初是null,然后是基本的(来自延迟补偿.setUserId),然后从服务器接收实际数据。每次重新运行Deps.autorun

绕过它的方法是检查配置文件,以便只捕获最终的运行

更改此行

if(Meteor.user()) {

到这个

if(Meteor.user() && Meteor.user().profile && Meteor.user().profile.name

此处假设您.name中有profile字段,但您可以使用任何字段。如果你拥有它,它可能是其他任何东西。我们的想法是只等待有关用户的最后一块数据从服务器到达。