我们可以使用安全的方法让用户端不直接操作数据库,但是还是可以直接读取数据库内容,如果我们还需要保护私有的数据存储,在客户端直接使用Collection.find(),这样的操作方式在实际的项目中并不会使用,这样的数据无法保证私有性和安全性。如果一些数据我们并不想自动的在客户端更新,就需要自定义publishsubscribe,如何在Meteor中自定义发布与订阅模式呢?

Remove Autopublish

在 Meteor:方法控制中我们移除了 insecure,在这里我们需要移除autopublish。顾名思义,autopublish的意思就是meteor自动的实现数据的publish/subscribe。

meteor remove autopublish

移除之后在我们添加数据以后,页面就不再直接显示数据了。想要显示数据,我们需要使用Meteor.publishMeteor.subscribe方法,让服务端通知客户端的数据更新。

发布与订阅

publish

if (Meteor.isServer) {Meteor.publish("languages", function () {return Languages.find();});
}

subsribe

if (Meteor.isClient) {Meteor.subscribe("languages");Template.meteor_collection.helpers({languages: Languages.find({}, {sort: {createdAt: -1}})});});

在Server端使用Meteor.publish函数注册一个"languages"的发布者,需要在客户端对"languages"进行订阅,使用Meteor.subscribe订阅了"languages",现在已经添加的数据就会重新出现在页面上。
利用发布/订阅模式,我们也可以实现对于私有数据的访问。

给数据添加private

在页面上添加一个private的按钮:

<template name="other_event">{{#each others}}<li><h3>{{name}} ,{{updateAt}}</h3><button class="delete">delete</button><button class="update">update</button>{{#unless private}}<button class="private">private</button>{{/unless}}</li>{{/each}}
</template>

添加设置为privte的方法:

Meteor.methods({addLanguage: function (text) {Languages.insert({name: text,createdAt: new Date()});},updateLanguage: function (_id) {Languages.update(_id, {$set: {updateAt: new Date()}})},removeLanguage: function (_id) {Languages.remove(_id);},setPrivate: function (_id) {Languages.update(_id, {$set: {private: true}})}
});

客户端调用设置privte的方法:

Template.other_event.events({'click .delete': function () {Meteor.call("removeLanguage", this._id);},'click .update': function () {Meteor.call("updateLanguage", this._id);},'click .private': function () {Meteor.call("setPrivate",this._id);}});

设置发布的数据必须是私有的

在Meteor.publish的可以使用filter过滤掉不是改用户的,非私有的数据:

  Meteor.publish("languages", function () {return Languages.find({$or: [{private: true}//auth user//,{owner:this.userId()}]});});

测试这样的数据可以使用不通的用户在不通的浏览器上面做测试,每个用户都是只能看到自己的数据。

对删除数据的操作做检查

只允许用户对于自己的数据进行删除操作

 removeLanguage: function (_id) {var language=Languages.findOne(_id);if(language.private&&language.owner !=Meteor.userId){throw new Meteor.Error("not-authorized");}Languages.remove(_id);}

这样我们就能保证私有数据的安全,客户端不能直接操作数据(remove insecure),客户端也不直接访问数据库(remove autopublish),就有效的保护私有数据的安全。

项目地址 :https://github.com/jjz/meteor/tree/master/meteor-publish

Meteor:发布与订阅相关推荐

  1. 面试被问到Redis实现发布与订阅,手摸手教

    简介 Redis发布与发布功能(Pub/Sub)是基于事件座位基本的通信机制,是目前应用比较普遍的通信模型,它的目的主要是解除消息的发布者与订阅者之间的耦合关系. Redis作为消息发布和订阅之间的服 ...

  2. 知方可补不足~SQL2008中的发布与订阅模式~续

    上一回介绍了如何在sql2008中建立一个数据库的发布者,今天来说一下如何建立一个订阅者,其实订阅者也是一个数据库,而这个数据库是和发布者的数据结构相同的库,它们之间通过SQL代理进行数据上的同步. ...

  3. etcd分布式之消息发布与订阅

    分布式之消息发布与订阅:        应用中用到的一些配置信息放到etcd上进行集中管理        索引的元信息和服务器集群机器的节点状态存放在etcd中        分布式日志收集系统   ...

  4. 023_Jedis的发布和订阅

    1. Redis为我们提供了publish/subscribe(发布/订阅)功能.我们可以对某个channel(频道)进行subscribe(订阅),当有人在这个channel上publish(发布) ...

  5. Redis发布与订阅(pub/sub)

    Redis发布与订阅(pub/sub) 本文档翻译自: http://redis.io/topics/pubsub . SUBSCRIBE . UNSUBSCRIBE 和 PUBLISH 三个命令实现 ...

  6. RabbitMQ官方中文入门教程(PHP版) 第三部分:发布/订阅(Publish/Subscribe)

    2019独角兽企业重金招聘Python工程师标准>>> 发布/订阅 在上篇教程中,我们搭建了一个工作队列.每个任务之分发给一个工作者(worker).在本篇教程中,我们要做的之前完全 ...

  7. Redis实现发布与订阅(转)

    简介 Redis发布与发布功能(Pub/Sub)是基于事件座位基本的通信机制,是目前应用比较普遍的通信模型,它的目的主要是解除消息的发布者与订阅者之间的耦合关系. Redis作为消息发布和订阅之间的服 ...

  8. Redis中的发布与订阅的概念与以命令行的方式实现发布订阅举例

    场景 什么是发布与订阅 发布订阅是一种应用程序(系统)之间通讯,传递数据的技术手段,特别是在异构(不同语言)系统之间的作用非常明显. 发布订阅: 类似于微信中关注公众号/订阅号,公众号/订阅号发布的文 ...

  9. Redis中的发布与订阅

    redis中实现发布与订阅相对于zookeeper非常简单.直接使用publish和subscribe就行. subscrible news; 订阅news这个channel publish news ...

最新文章

  1. NYOJ 45 棋盘覆盖
  2. 宝塔面板部署nuxt_MacOS下创建及部署vue.js项目(及Nuxt.js、PM2等相关流程)
  3. MATLAB-矩阵相关计算(1)
  4. python水印 resized_如何改进Python中的水印图像?
  5. HDU3788 ZOJ问题
  6. 红帽启动apache服务器_红帽7搭建httpd的三种模式(基于主机,端口,IP)
  7. 抢红包概率是随机的吗_顺丰发5亿红包给员工:管理学的随机奖励还能这么玩...
  8. 黑马Java学习笔记之-----数组
  9. 如何判断绝缘接头质量的好坏?
  10. HTML+CSS+JS大作业:生态环境网站设计——环境保护主题-绿色环保 (9页) web期末作业设计网页_绿色环保大学生网页设计作业成品
  11. 姜小白的Python日记Day11 生成器与并行运算
  12. 【vbox】Linux安装Virtual Box虚拟机实践记录--编辑中
  13. 钉钉自定义机器人python_钉钉自定义机器人demo
  14. 什么是微分?导数和微分的区别是什么?微分和积分的联系?
  15. 服务器的速度没有虚拟主机快,云服务器没有虚拟主机快
  16. 互联网晚报 | 10月24日 星期日 | 华为鸿蒙生态建设投入已超500亿;瑞幸门店端扭亏为盈;文旅部要求暂停经营旅游专列业务...
  17. HTML5 新增的结构元素——能用不代表用对了
  18. 怎么看电脑支持多少兆网速_Win7系统下查看电脑宽带是多少兆的2个方法
  19. 第十六章 SQL函数 ABS
  20. 中小型企业搭建数据团队的踩坑分析

热门文章

  1. ASP.NET Core Web Razor Pages系列教程八: 添加验证
  2. IDEA 2019 生成Spring Boot项目,编写第一个Hello World程序,并打包成jar
  3. mysql查看修改记录_(转)MySql中监视增删改查和查看日志记录
  4. matlab系统的根轨迹,实验五 利用MATLAB绘制系统根轨迹
  5. 【Netty】传输(Transport)
  6. Docker(八):Docker Compose
  7. iOS 开发 高级:使用 宏定义macros (#,##,...,__VA_ARGS_)
  8. 网络服务-VSFTP
  9. debian虚拟机装上后开机不行_华为MT9进水不开机, 一步一个“坑”把掌柜修的也是无语,想发火...
  10. python 车牌识别简单_智能车牌识别 停车如此简单