Meteor.js中的房间/频道和userId

时间:2015-06-05 01:07:48

标签: javascript meteor meteor-accounts

我正在使用meteor.js构建一个基于回合制的多人游戏。该应用程序将处理多个游戏,因此我想将我的用户分成几个房间。 我在使用socket.io频道之前已经完成了它,但是我很难理解它应该如何在Meteor中完成。

我想要实现的目标是:

  1. 用户访问http://localhost:3000/join/userId

  2. 我使用" sessionId"对外部API进行服务器端调用。作为参数,获取用户的userId,他指定的roomId以及此房间允许的userId数组

  3. 我想为用户创建一个带roomId的房间,或者将他加入现有房间。我知道我应该创建一个' Rooms'收藏,但我不知道如何将用户绑在我的房间,只向在给定房间里的人发布消息。

  4. 我想避免使用'帐户'包裹,因为我不需要我的授权 - 它将由上面提到的第2步处理 - 但如果最简单和最干净的方法是添加这个包,我可以改变主意。

1 个答案:

答案 0 :(得分:1)

您的Rooms收藏品可能如下:

{
    _id: "<auto-generated>",
    roomId: "roomId",
    users: [ "user1", "user2", "user3", ... ],
    messages: [
        { message: "", userId: "" },
        { message: "", userId: "" },
        { message: "", userId: "" },
        ...
    ]
}

服务器端API调用返回

userIdroomId以及其他信息。

所以你可以做一个

Rooms.update({ roomId: roomId }, { $push: { users: userId } }, { upsert: true });

这会将用户推入现有房间或创建新房间并添加用户。

您的发布功能可能如下所示:

Meteor.publish("room", function(roomId) {
    // Since you are not using accounts package, you will have to get the userId using the sessionId that you've specified or some other way.
    // Let us assume your function getUserId does just that.

    userId: getUserId( sessionId );
    return Rooms.find({ roomId: roomId, users: userId });

    // Only the room's users will get the data now.

});

希望这有帮助。