拥有独特的用户房间的更好方法是什么

Whats a better way to have unique user rooms

本文关键字:更好 方法 是什么 房间 用户 拥有      更新时间:2023-09-26

逻辑是单击用户,检查现有房间。如果有,请转到现有房间。如果没有,则创建新房间并进入其中。用户和我之间只会有一个独特的房间。当我第一次单击用户时,它会为房间设置一个唯一的 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   

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

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

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

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

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运算符:

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

使用此设计,有几种方法可以实现路由和按钮:

  1. 将其他用户的 ID 放在路由中,例如 allRooms/:otherUser .路由器、模板和出版物可以使用userAAndB(userId, otherUser)来查找所需的房间。

    在这种情况下,您需要一些代码来创建房间(如果它不存在)。在服务器上是最好的,所以你可以把它放在发布功能中。这意味着客户端不需要知道房间 ID,只需链接到正确的路由即可。

  2. 将房间 ID 放在路由中,例如 allRooms/:_id 。路由器、模板和出版物可以使用房间的_id

    在这种情况下,您需要找出给定用户对的正确房间 ID 是什么,以便建立链接。使用userAAndB(userId, otherUser)这很容易。如果不存在新房间,您还需要创建一个新房间。您可以在用户单击链接时执行此操作。

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


稍微相关,因为您正在询问更好的代码结构方法,我想提到Iron Router的waitOndata功能。

您可以让Iron Router为您进行订阅和获取数据,这样您就不需要在模板中进行。如果在加载主数据之前无法合理地呈现模板,这将非常有用,并且在您的roomDetail路由中可能很好。例如,在铁路由器指南的这一部分中查找waitOndata