资讯专栏INFORMATION COLUMN

Meteor:发布与订阅

leone / 2096人阅读

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

我们可以使用安全的方法让用户端不直接操作数据库,但是还是可以直接读取数据库内容,如果我们还需要保护私有的数据存储,在客户端直接使用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的按钮:


添加设置为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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/18827.html

相关文章

  • Meteor发布订阅

    摘要:发布与订阅在端使用函数注册一个的发布者,需要在客户端对进行订阅,使用订阅了现在已经添加的数据就会重新出现在页面上。利用发布订阅模式,我们也可以实现对于私有数据的访问。 我们可以使用安全的方法让用户端不直接操作数据库,但是还是可以直接读取数据库内容,如果我们还需要保护私有的数据存储,在客户端直接使用Collection.find(),这样的操作方式在实际的项目中并不会使用,这样的数据无法...

    animabear 评论0 收藏0
  • 翻译 Meteor React 制作 Todos - 11 - 发布订阅

    摘要:通过发布订阅模式过滤数据现在我们已经把应用中比较敏感的代码放到了一些方法里面,我们还需要学习安全故事的另一半内容了。当在客户端被调用时传入发布器名称,客户端将会从发布器订阅所有的数据。这个按钮应该只是给任务的所有者来显示。 通过发布订阅模式过滤数据 现在我们已经把应用中比较敏感的代码放到了一些方法里面,我们还需要学习Meteor安全故事的另一半内容了。到现在为止,我们一直是假设整个整个...

    用户83 评论0 收藏0
  • 翻译 Meteor React 制作 Todos - 12 - 下一步

    摘要:下一步干什么恭喜你刚刚成功编写了你的应用,别忘了再部署一遍,这样你的朋友们就可以使用这些新特性了你的应用在一个单个的任务清单中是支持合作的。检查一下例子待办事项。更多的可以控制分享多个列表的已完成应用。 下一步干什么? 恭喜你刚刚成功编写了你的Meteor应用,别忘了再部署一遍,这样你的朋友们就可以使用这些新特性了! 你的应用在一个单个的任务清单中是支持合作的。试试怎么样添加更多的功能...

    anRui 评论0 收藏0
  • RDD的前端背包

    摘要:中文最小字体问题添加属性以取消浏览器的自动调整会使原本应该调整的地方失效原本就是专为了移动端设置的属性,桌面端不适应已修复建议通过缩小来获得小字体。 暂时先堆在一起,等某条目里面的内容超过十条了,就单列出去。 更新历史: 17.7.24 =ADD= typescript —> interface =ADD= alof awsome net 17.7.23 =ADD=...

    Pandaaa 评论0 收藏0
  • RDD的前端背包

    摘要:中文最小字体问题添加属性以取消浏览器的自动调整会使原本应该调整的地方失效原本就是专为了移动端设置的属性,桌面端不适应已修复建议通过缩小来获得小字体。 暂时先堆在一起,等某条目里面的内容超过十条了,就单列出去。 更新历史: 17.7.24 =ADD= typescript —> interface =ADD= alof awsome net 17.7.23 =ADD=...

    csRyan 评论0 收藏0

发表评论

0条评论

leone

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<