有什么更好的方式来拥有独特的用户房间

Whats a better way to have unique user rooms

逻辑是点击用户,检查现有房间。如果有,请转到现有房间。如果没有,创建新房间并进入它。用户和我之间只会有一个独特的房间。当我第一次点击用户时,它会为房间设置一个唯一的 ID。但是,如果我第二次单击该名称,它会将我路由到一个带有 url 参数作为用户 ID 的房间。

想知道出了什么问题,是否有更简洁的方法。我也无法显示接收者的姓名。我使用了助手 Meteor.users.findOne({ _id: this.receiver }).

房间详情

    //subscription
    self.subscribe('room', Router.current().params._id);
    //.. room helper
    return Rooms.findOne({ _id: Router.current().params._id });

用户页面点击按钮

    Template.usersShow.events({
      'click .user': function(event) {                       
        var receiver = this._id;           

        if (receiver) {
          var res = Rooms.findOne({ 'receiver' : receiver }); 
          if(res){     
              //..route to the existing room
          } else {
              //...create new room   

为了确保任何一对用户之间只有一个房间,您应该平等对待 "initiator" 和 "receiver"。下面我描述了一种方法。

一个房间有一个id(内置_id)和两个用户的id:

{
    userA: "aaaa",
    userB: "bbbb",
    // ...
}

在 "aaaa" 和 "bbbb" 之间寻找房间时,我们不知道哪个是哪个。我们可以通过强加 userA 的 id 排在 userB 之前的规则来避免这个问题。为了方便使用这个规则,我们写了一个辅助函数:

function userAAndB(user1, user2) {
    if (user1 < user2) return {userA: user1, userB: user2};
    else return {userA: user2, userB: user1};
}

现在如果我们想为用户 xy 查找 房间,我们可以这样查找:

var theRoom = Rooms.findOne(userAAndB(x, y));

助手也可以作为创建新房间的起点。

为了找到用户所在的所有房间,我们可以使用 $or operator:

var allRoomsWithX = Rooms.find({$or: [{userA: x}, {userB: x}]});

使用此设计,您可以通过多种方式实现路由和按钮:

  1. 将其他用户的id放在路由中,如allRooms/:otherUser。路由器、模板和发布可以使用userAAndB(userId, otherUser)找到他们需要的房间。

    在这种情况下,如果房间不存在,您需要一些代码来创建房间。在服务器上最好,所以你可以把它放在发布功能中。这意味着客户端不需要知道房间id,并且可以简单地link到正确的路线。

  2. 将房间id放在路由中,如allRooms/:_id。路由、模板、发布可以使用房间的_id.

    在这种情况下,您需要找出给定的一对用户的正确房间 ID,才能创建 link。使用 userAAndB(userId, otherUser) 非常容易。如果不存在,您还需要创建一个新房间。您可以在用户单击 link.

    时执行此操作

    最好制作一个 Meteor 方法来获取一对用户的房间 ID,这样您就不需要将所有房间发送给客户端。该方法类似于 getRoomId(user1, user2),如果需要它会创建一个房间,然后 return id。


有点相关,因为你问的是构建代码的更好方法,我想提一下 Iron Router 的 waitOndata 特性。

您可以让 Iron Router 为您进行订阅和获取数据,这样您就不需要在模板中进行这些操作。如果在加载主要数据之前无法合理地呈现模板,这非常好,并且在您的 roomDetail 路线中可能会很好。在 this section of the Iron Router guide 中查找 waitOndata 作为示例。