如何更新 angular-meteor 中的用户字段?

How to update user field in angular-meteor?

我已将所有用户配置为使用空收藏夹数组创建:user.favorites: []

由于用户collection的区别对待,我应该如何在angular-meteor中发布、订阅和访问订阅的收藏夹数据?

这是我目前的情况:

// Meteor.methods ==========================================
addFavorite: function(attendeeId){

var loggedInUser = Meteor.user();
if( !loggedInUser ){
  throw new Meteor.Error("must be logged in");
}

    loggedInUser.favorites.push(attendeeId);
    loggedInUser.username = loggedInUser.username+"x";

    console.log(loggedInUser.favorites);

}


// controller ========================================
    $scope.addFavorite = function(attendeeId){
        $meteor.call("addFavorite", attendeeId);
    }

// server =======================================================
Meteor.publish('myFavorites', function(){
    if(!this.userId) return null;

    return Meteor.users.find(this.userId);
});

Meteor.users.allow({

    insert: function(userId, doc){
        return true;
    },

    update: function(useId, doc, fieldNames, modifier){
        return true;
    },

    remove: function(userId, doc){
        return true;
    }

});

User.favorites 为空。调用 addFavorite 时,它​​会记录一个包含单个 userId 的数组,该数组根本不会更新 mongoDB。看起来好像 Meteor.user() 没有重新更新。有谁知道我做错了什么?谢谢!

编辑 代码的最新迭代。收藏夹被传递到 $scope.favorites 但不是反应性的。我该如何解决?谢谢!

// publish
Meteor.publish('myFavorites', function(){
    if(this.userId){
        return Meteor.users.find(this.userId, {
            fields: {
                favorites: 1
            }
        });
    }else{
        this.ready();
    }
});

// subscribe
$meteor.subscribe('myFavorites')
    .then(function(subscriptionHandle)
{
    var user = $meteor.collection(function(){
        return Meteor.users.find({_id: Meteor.userId()});
    });
    $scope.favorites = user[0].favorites;
});

tldr;

Accounts collection 是反应式的,但默认情况下只有 username, emails, and profile fields are published。最快的解决方法是将收藏夹作为新字段附加到 User.profile object。

// Meteor.methods ==========================================
addFavorite: function(attendeeId){

var loggedInUser = Meteor.user();
if( !loggedInUser ){
  throw new Meteor.Error("must be logged in");
}
    if (loggedInUser.profile.favorites){
        loggedInUser.profile.favorites.push(attendeeId);
    }
    else {
        loggedInUser.profile.favorites = [];
        loggedInUser.profile.favorites.push(attendeeId);
    }
    loggedInUser.username = loggedInUser.username+"x";

    console.log(loggedInUser.profile.favorites);

}

虽然现在您可能正在写信给用户,您可以使用 meteor mongo --> db.users.find().pretty() 来验证这一点,但订阅不会发布您的收藏夹字段。

替代方法

或者,您可以发布收藏夹字段

// Server code --------
Meteor.publish("userData", function () {
  if (this.userId) {
    return Meteor.users.find({_id: this.userId},
                             {fields: {'favorites': 1}});
  } else {
    this.ready();
  }
});

有主见Meteor.users哲学

我喜欢围绕 3 个属性构建我的用户 object:

  • User.profile --> 发布给客户端,客户端可以通过client-side代码直接修改
  • User.public --> 发布给客户端,但不可修改,除非通过 server-side Meteor methods
  • User.private --> 未发布到客户端(即只能在服务器代码上读取),并且只能由服务器代码修改(使用客户端模拟)

只需确保在删除 insecureautopublish 软件包时,您 double-check 通过使用 Meteor.users.allow() 函数中的 Collections 安全性服务器代码

运行 meteor list 以验证是否在当前项目中使用了 insecureautopublish 包。注意:默认情况下,Meteor 会在您首次创建应用程序时安装它们)

// Server code --------
Meteor.publish("userData", function () {
  if (this.userId) {
    return Meteor.users.find({_id: this.userId},
                             {fields: {'public': 1}});
  } else {
    this.ready();
  }
});