繁体   English   中英

如何在新的Meteor Collection文档中在服务器上设置created_on字段?

[英]How do I set a created_on field on the server in a new Meteor Collection document?

我正在建立一个按时间顺序显示帖子的聊天室。 我目前正在“条目”模板的提交事件中设置客户端js中用户帖子的时间:

Template.entry.events =  {
  'submit': function(e){
    e.preventDefault();
    //console.log(this.userId());
    var user = Meteor.user();
    var roomName = Session.get('currentRoomName');
    Messages.insert({
      user: user,
      room_name: roomName,
      message: $('#message').val(),
      created_on: new Date().getTime()
    });
    $("#message").val('');
  }
};

我的问题是因为这个日期是在客户端上设置的,如果用户在他们的机器上更改时间,它将被记录为允许用户在当前对话之前或之后发布。 理想情况下,我可以在收到新的聊天条目后更新服务器上的created_on时间,以反映服务器上的当前UTC时间并更正任何值。我仍然希望在客户端上有时间延迟补偿等

我已经阅读了很多关于II的Meteor文档,怀疑我可能会使用.observe()来解决这个问题,但我是Meteor和Mongodb的新手。 观察入门集合中的每个文档会不会很疯狂? 是否可以仅观察新条目?

我也在使用auth分支 - 不确定这是否会有所不同。

如果聊天室中有很多用户, 这个非问题可能最终会被关联。

如果在Mongo / Meteor中这是一件非常容易的东西,我只是遗憾地道歉。

最简单的解决方案是使用方法而不是Messages.insert创建的隐式方法。

在服务器上:

Meteor.methods({
  addMessage: function(room_name, message) {
    Messages.insert({
      userId: this.userId,
      room_name: room_name,
      message: message,
      created_on: new Date().getTime();
    });
  });
});

在客户端:

Template.entry.events =  {
  'submit': function(e) {
    e.preventDefault();
    Meteor.call('addMessage', Session.get('currentRoomName'), $('#message').val());
  }
}

这将立即在客户端创建记录(使用客户端的日期),同时在服务器上创建记录(使用服务器的日期),然后在下次同步时覆盖客户端的记录。

我强烈建议您在auth分支中引入ACL。 插入/更新/删除/获取时,您可以进行一些验证和/或修改。 看看在Meteor.Collection.prototype.allow源文件下packages/mongo-livedata/collection.js

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM