javascript - meteorjs用户权限未与服务器同步

标签 javascript mongodb meteor client-side server-side

我是meteorjs 和 MongoDB 的新手。 我在 Win 7 上运行 Meteor,并关注 isaac strack 的“Meteor.js JavaScript 框架入门”,但我停留在第 6 章“授予管理员权限” 我正在关注他的代码,但似乎当管理员登录时,我将一个项目添加到列表中,该项目显示为秒的分割,可能是因为本地缓存和服务器同步 但我在这里做错了什么? 我的代码: 客户端:

Meteor.subscribe('Categories');

Meteor.autosubscribe(function() {
    Meteor.subscribe("listdetails",
        Session.get('current_list'));
});

Template.categories.lists = function () {
    return lists.find({},{sort: {Category: 1}});
};

Session.set('adding_category', false);

Template.categories.new_cat = function () {
    return Session.equals('adding_category',true);
};
Template.categories.events({

    'click #btnNewCat': function (e, t) {

        Session.set('adding_category', true);

        Meteor.flush();
        focusText(t.find("#add-category"));
    },

    'keyup #add-category': function (e,t){
        if (e.which === 13)
        {
            var catVal = String(e.target.value || "");
            if (catVal)
            {
                lists.insert({Category:catVal,owner:this.userId});
                Session.set('adding_category', false);
            }
        }
    },
    'focusout #add-category': function(e,t){

        Session.set('adding_category',false);

    },
    'click .category': selectCategory
});

/////Generic Helper Functions/////

//this function puts our cursor where it needs to be.
function focusText(i,val) {
    i.focus();
    i.value = val ? val : "";
    i.select();

};//< -----This is the end tag for focusText() -----

function selectCategory(e,t){
    Session.set('current_list',this._id);
}

function addItem(list_id,item_name){
    if (!item_name&&!list_id)
        return;
    lists.update({_id:list_id},
        {$addToSet:{items:{Name:item_name}}});
}

function removeItem(list_id,item_name){
    if (!item_name&&!list_id)
        return;
    lists.update({_id:list_id},
        {$pull:{items:{Name:item_name}}});
}

function updateLendee(list_id,item_name,lendee_name){
    var l = lists.findOne({"_id":list_id ,
        "items.Name":item_name});
    if (l&&l.items)
    {
        for (var i = 0; i<l.items.length; i++)
        {
            if (l.items[i].Name === item_name)
            {
                l.items[i].LentTo = lendee_name;
            }
        }
        lists.update({"_id":list_id},{$set:{"items":l.items}});
    }
};

Template.list.items = function () {
    if (Session.equals('current_list',null)) return null;
    else
    {
        var cats = lists.findOne({_id:Session.get('current_list')});
        if (cats&&cats.items)
        {
            for(var i = 0; i<cats.items.length;i++) {
                var d = cats.items[i]; d.Lendee = d.LentTo ? d.LentTo :
                    "free"; d.LendClass = d.LentTo ?
                    "label-important" : "label-success";
            }
            return cats.items;
        }
    }
};// < ---- ending bracket for Template.list.items function ----

Template.list.list_selected = function() {
    return ((Session.get('current_list')!=null) &&
        (!Session.equals('current_list',null)));
};
Template.categories.list_status = function(){
    if (Session.equals('current_list',this._id))
        return "";
    else
        return " btn-inverse";
};
Template.list.list_adding = function(){
    return (Session.equals('list_adding',true));
};
Template.list.lendee_editing = function(){
    return (Session.equals('lendee_input',this.Name));
};

Template.list.events({
    'click #btnAddItem': function (e,t){
        Session.set('list_adding',true);
        Meteor.flush();
        focusText(t.find("#item_to_add"));
    },
    'keyup #item_to_add': function (e,t){
        if (e.which === 13)
        {
            addItem(Session.get('current_list'),e.target.value);
            Session.set('list_adding',false);
        }
    },
    'focusout #item_to_add': function(e,t){
        Session.set('list_adding',false);
    },
    'click .delete_item': function(e,t){
        removeItem(Session.get('current_list'),e.target.id);
    },
    'click .lendee' : function(e,t){
        Session.set('lendee_input',this.Name);
        Meteor.flush();
        focusText(t.find("#edit_lendee"),this.LentTo);
    },
    'keyup #edit_lendee': function (e,t){
        if (e.which === 13)
        {
            updateLendee(Session.get('current_list'),this.Name,
                e.target.value);
            Session.set('lendee_input',null);
        }
        if (e.which === 27)
        {
            Session.set('lendee_input',null);
        }
    }
});

Accounts.ui.config({
    passwordSignupFields: 'USERNAME_AND_OPTIONAL_EMAIL'
});

服务器端:

Meteor.startup(function () {
    Meteor.publish("Categories", function() {
        return lists.find({owner:this.userId},{fields:{Category:1}});
    });
    Meteor.publish("listdetails", function(category_id){
        return lists.find({_id:category_id});
    });
});

两者:

function adminUser(userId) {
     var adminUser = Meteor.users.findOne({username:"admin"});
     return (userId && adminUser && userId === adminUser._id);
 }
 lists.allow({
     insert: function(userId, doc){
         return (adminUser(userId) || (userId && doc.owner === userId));
     },
     update: function(userId, docs, fields, modifier){
         return adminUser(userId) || _.all(docs, function(doc) {
             return doc.owner === userId;
         });
     },
     remove: function (userId, docs){
         return adminUser(userId) || _.all(docs, function(doc) {
             return doc.owner === userId;
         });
     }
 });

html:

<head>
  <title>LendLib</title>
</head>

<body>
<div style="float:right; margin-right:20px;">
    {{loginButtons align="right"}}
</div>
<div id="lendlib">
    <div id="categories-container">
        {{> categories}}
    </div>
    <div id="list">
        {{> list}}
    </div>
</div>
</body>

<template name="categories">
    <h2 class="title">
        my stuff
    </h2>
    <div id="categories" class="btn-group">
        {{#if new_cat}}
        <div class="category">
            <input type="text" id="add-category" value="" />
        </div>
        {{else}}
        <div class="category btn btn-inverse"
             id="btnNewCat">&plus;</div>
        {{/if}}
        {{#each lists}}
        <div class="category btn {{list_status}}" id="{{_id}}">
            {{Category}}
        </div>
        {{/each}}
    </div>
</template>

<template name="list">
    <ul id="lending_list">
        {{#each items}}
        <li class="lending_item alert">
            <button type="button" class="close delete_item"
                    id="{{Name}}">×</button>
            {{Name}}
            {{#if lendee_editing}}
            <input type="text" id="edit_lendee" class="span2
pull-right" value=""/>
            {{else}}
            <div class="lendee pull-right label {{LendClass}}">
                {{Lendee}}</div>
            {{/if}}
        </li>
        {{/each}}
        {{#if list_selected}}
        <li class="alert-success" id="btnAddItem">&plus;
            {{#if list_adding}}
            <input class="span4" id="item_to_add" size="32"
                   type="text">
            {{/if}}
        </li>
        {{/if}}
    </ul>
</template>

最佳答案

经过大量调试尝试和失败后,我解决了问题,问题出在服务器端,这是原始代码:

Meteor.startup(function () {
    Meteor.publish("Categories", function() {
        return lists.find({owner:this.userId},{fields:{Category:1}});
    });
    Meteor.publish("listdetails", function(category_id){
        return lists.find({_id:category_id});
    });
});

这是固定代码:

Meteor.startup(function () {
    Meteor.publish("Categories", function() {
        return lists.find({owner:Meteor.userId},{fields:{Category:1}});
    });
    Meteor.publish("listdetails", function(category_id){
        return lists.find({_id:category_id});
    });
});

注意:更改是在第 3 行完成的,而不是owner:this.userId - 不存在,我将其替换为 Meteor.userId

关于javascript - meteorjs用户权限未与服务器同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18541120/

相关文章:

javascript - Meteor - 将数据从模板传递到事件,点击按钮

reactjs - 明确停止订阅

javascript - 后台有 mysql 数据库的 Spring 应用程序的 ICD 10 下拉列表

javascript - Cordova - 用于“保持”录制音频的按钮 - 有时会停止

javascript - 在 Firefox 中生成 jsPDF 时存在兼容性问题的 pdf 吗?

node.js - Mongoose 与第三级嵌套字段值进行比较

php - DDD - 在面向文档的存储、PostgreSQL、MongoDB 中存储域对象

node.js - NodeJS-Mongo : Querying the database and gridfs and returning both the document and the image to the user

javascript - 将多层图像排列成圆圈?是否可以?

javascript - 将 Mozila Pdf.js 与 Meteor 集成