多个用户未收到 Meteor 方法调用的结果 - 工作一次,然后 returns 未定义?

multiple users not receiving result from Meteor method call - works once, then returns undefined?

好的,这很有趣。我正在对 Meteor 中的用户列表进行排序,并尝试 return 将用户的索引号发送给客户端。即我希望创建的第一个用户位于位置 1,创建的第二个用户位于位置 2,第三个用户位于位置 3,等等

我在服务器上使用 Meteor 方法:

Meteor.methods({
  setPosition: function(userId) {
    let usersArray = Meteor.users.find({}, {sort: {createdAt: 1}}).fetch();
    if (!this.userId) {
      throw new Meteor.Error('not-authorized');
    }
    let pos = [];
    for (i = 0; i < usersArray.length; i ++) {
      if (usersArray[i]._id === this.userId) {
         pos = i + 1;
       }
         console.log('this is the position', pos);
         return pos;
     };
    }
  }); //Meteor methods
}//end of meteor isServer

上面的服务器代码在终端中运行良好,除了 "return pos" 行,这使得代码为第一个用户(我看到位置 1)将值传递给客户端,但随后中断用户(res 未定义)。如果我删除 "return pos" 行,那么代码在服务器上对所有用户都能完美运行,但是我无法从客户端 上的 Meteor 方法调用获得单一结果。

下面的客户端代码无法从服务器上的方法调用接收结果,我不知道为什么:

Tracker.autorun(() => {
  Meteor.subscribe('position');
    Meteor.call('setPosition', Meteor.userId(), (err, res) => {
      if (err) {
        throw new Meteor.Error(err.message);
        console.log(err);
      } else {
        console.log(res);
        console.log(Meteor.userId());
        Session.set('position', res);
      }
    });
});

另外,我是新手,所以对于明显的格式错误,我深表歉意,如果您觉得需要,请指出。谢谢!

我们只是说这种方法不太可能很好地扩展,因为您拥有的用户越多,找到用户在用户列表中的位置所需的时间就越长。

假设用户的位置永远不会改变(即您不关心删除 - 第 4 个用户始终是第 4 个,即使 #3 被删除),您最好添加一个 sequence 键到用户创建时的用户对象。您可以查看最近创建的用户的序列号并将其递增 1 以将其提供给下一个用户。当然,您会希望将该键编入索引。然后每个用户只需 Meteor.user().sequence

就可以知道他们的序列号