Meteor:发布与订阅
我们可以使用安全的方法让用户端不直接操作数据库,但是还是可以直接读取数据库内容,如果我们还需要保护私有的数据存储,在客户端直接使用Collection.find()
,这样的操作方式在实际的项目中并不会使用,这样的数据无法保证私有性和安全性。如果一些数据我们并不想自动的在客户端更新,就需要自定义publish
和subscribe
,如何在Meteor中自定义发布与订阅模式呢?
Remove Autopublish
在 Meteor:方法控制中我们移除了 insecure
,在这里我们需要移除autopublish
。顾名思义,autopublish的意思就是meteor自动的实现数据的publish/subscribe。
meteor remove autopublish
移除之后在我们添加数据以后,页面就不再直接显示数据了。想要显示数据,我们需要使用Meteor.publish
和Meteor.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:发布与订阅相关推荐
- 面试被问到Redis实现发布与订阅,手摸手教
简介 Redis发布与发布功能(Pub/Sub)是基于事件座位基本的通信机制,是目前应用比较普遍的通信模型,它的目的主要是解除消息的发布者与订阅者之间的耦合关系. Redis作为消息发布和订阅之间的服 ...
- 知方可补不足~SQL2008中的发布与订阅模式~续
上一回介绍了如何在sql2008中建立一个数据库的发布者,今天来说一下如何建立一个订阅者,其实订阅者也是一个数据库,而这个数据库是和发布者的数据结构相同的库,它们之间通过SQL代理进行数据上的同步. ...
- etcd分布式之消息发布与订阅
分布式之消息发布与订阅: 应用中用到的一些配置信息放到etcd上进行集中管理 索引的元信息和服务器集群机器的节点状态存放在etcd中 分布式日志收集系统 ...
- 023_Jedis的发布和订阅
1. Redis为我们提供了publish/subscribe(发布/订阅)功能.我们可以对某个channel(频道)进行subscribe(订阅),当有人在这个channel上publish(发布) ...
- Redis发布与订阅(pub/sub)
Redis发布与订阅(pub/sub) 本文档翻译自: http://redis.io/topics/pubsub . SUBSCRIBE . UNSUBSCRIBE 和 PUBLISH 三个命令实现 ...
- RabbitMQ官方中文入门教程(PHP版) 第三部分:发布/订阅(Publish/Subscribe)
2019独角兽企业重金招聘Python工程师标准>>> 发布/订阅 在上篇教程中,我们搭建了一个工作队列.每个任务之分发给一个工作者(worker).在本篇教程中,我们要做的之前完全 ...
- Redis实现发布与订阅(转)
简介 Redis发布与发布功能(Pub/Sub)是基于事件座位基本的通信机制,是目前应用比较普遍的通信模型,它的目的主要是解除消息的发布者与订阅者之间的耦合关系. Redis作为消息发布和订阅之间的服 ...
- Redis中的发布与订阅的概念与以命令行的方式实现发布订阅举例
场景 什么是发布与订阅 发布订阅是一种应用程序(系统)之间通讯,传递数据的技术手段,特别是在异构(不同语言)系统之间的作用非常明显. 发布订阅: 类似于微信中关注公众号/订阅号,公众号/订阅号发布的文 ...
- Redis中的发布与订阅
redis中实现发布与订阅相对于zookeeper非常简单.直接使用publish和subscribe就行. subscrible news; 订阅news这个channel publish news ...
最新文章
- NYOJ 45 棋盘覆盖
- 宝塔面板部署nuxt_MacOS下创建及部署vue.js项目(及Nuxt.js、PM2等相关流程)
- MATLAB-矩阵相关计算(1)
- python水印 resized_如何改进Python中的水印图像?
- HDU3788 ZOJ问题
- 红帽启动apache服务器_红帽7搭建httpd的三种模式(基于主机,端口,IP)
- 抢红包概率是随机的吗_顺丰发5亿红包给员工:管理学的随机奖励还能这么玩...
- 黑马Java学习笔记之-----数组
- 如何判断绝缘接头质量的好坏?
- HTML+CSS+JS大作业:生态环境网站设计——环境保护主题-绿色环保 (9页) web期末作业设计网页_绿色环保大学生网页设计作业成品
- 姜小白的Python日记Day11 生成器与并行运算
- 【vbox】Linux安装Virtual Box虚拟机实践记录--编辑中
- 钉钉自定义机器人python_钉钉自定义机器人demo
- 什么是微分?导数和微分的区别是什么?微分和积分的联系?
- 服务器的速度没有虚拟主机快,云服务器没有虚拟主机快
- 互联网晚报 | 10月24日 星期日 | 华为鸿蒙生态建设投入已超500亿;瑞幸门店端扭亏为盈;文旅部要求暂停经营旅游专列业务...
- HTML5 新增的结构元素——能用不代表用对了
- 怎么看电脑支持多少兆网速_Win7系统下查看电脑宽带是多少兆的2个方法
- 第十六章 SQL函数 ABS
- 中小型企业搭建数据团队的踩坑分析
热门文章
- ASP.NET Core Web Razor Pages系列教程八: 添加验证
- IDEA 2019 生成Spring Boot项目,编写第一个Hello World程序,并打包成jar
- mysql查看修改记录_(转)MySql中监视增删改查和查看日志记录
- matlab系统的根轨迹,实验五 利用MATLAB绘制系统根轨迹
- 【Netty】传输(Transport)
- Docker(八):Docker Compose
- iOS 开发 高级:使用 宏定义macros (#,##,...,__VA_ARGS_)
- 网络服务-VSFTP
- debian虚拟机装上后开机不行_华为MT9进水不开机, 一步一个“坑”把掌柜修的也是无语,想发火...
- python 车牌识别简单_智能车牌识别 停车如此简单