Meteor:宣布与定阅

我们能够运用平安的要领让用户端不直接操纵数据库,然则照样能够直接读取数据库内容,假如我们还须要庇护私有的数据存储,在客户端直接运用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

    原文作者:姜家志
    原文地址: https://segmentfault.com/a/1190000004408636
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞