【问题标题】:Meteor private messaging between users流星用户之间的私人消息
【发布时间】:2015-04-08 18:56:07
【问题描述】:

现在我有一个在 Meteor 中开发的工作消息系统,用户可以在其中互相发送私人消息。

服务器如下所示:

// .. lot of code
Meteor.publish("privateMessages", function () {
    return PMs.find({ to: this.userId });
});
PMs.allow({
    insert: function(user, obj) {
        obj.from = user;
        obj.to = Meteor.users.findOne({ username: obj.to })._id;
        obj.read = false;
        obj.date = new Date();
        return true;
    }
});
// .. other code

当用户订阅 privateMessages 时,他会得到一个如下所示的 mongo 对象:

{ "to" : "LStjrAzn8rzWp9kbr", "subject" : "test", "message" : "This is a test", "read" : false, "date" : ISODate("2014-07-05T13:37:20.559Z"), "from" : "sXEre4w2y55SH8Rtv", "_id" : "XBmu6DWk4q9srdCC2" }

如何更改对象以返回用户名而不是用户 ID?

【问题讨论】:

    标签: meteor


    【解决方案1】:

    您需要以类似于将username 更改为_id 的方式执行此操作。你可以创建一个实用函数:

    var usernameById = function(_id) {
      var user = Meteor.users.findOne(_id);
      return user && user.username;
    };
    

    编辑:

    如果您不想为每条消息轮询 minimongo,只需在消息对象中包含 username 而不是 _id。由于username 是独一无二的,所以它们就足够了。

    如果在您的应用中您允许用户更改username,最好保留_id 以作记录。

    在我一直在使用的一个较大的应用程序中,我们将用户的 _id 保留在模型中(以创建指向个人资料的链接等),并缓存了他的 profile.name(用于显示目的)。

    【讨论】:

    • 这里的返回值是user.username,而不是&& username
    • 我可以做到,但它需要遍历所有 mongodb 文档,并且会影响性​​能(例如,当有很多消息时)
    • @Stennie 实际上我认为如果user 是真实的,它将返回user.username 的值,而不是我假设你期望的布尔值。
    • 我之前的代码有错误。感谢@Stennie 的关注。
    • 如果您想避免每次都查看用户集合,只需将用户名存储在消息中而不是(或连同)_id。
    【解决方案2】:

    我建议从大气中添加收集助手包。然后为 PM 创建一个名为 toUser 的帮助程序,该帮助程序返回适当的用户。 然后您可以使用 message.user.name 获取名称。

    【讨论】:

      猜你喜欢
      • 2017-02-18
      • 2015-03-08
      • 2017-06-04
      • 2016-05-07
      • 1970-01-01
      • 1970-01-01
      • 2016-06-07
      • 2011-07-05
      • 1970-01-01
      相关资源
      最近更新 更多