流星集合插入允许抛出错误

时间:2015-07-01 03:29:51

标签: javascript meteor

目前我只想在插入项目之前检查用户是否已登录。我最终会改变这一点,所以只有某些用户可以插入某些项目,但是现在我只是想确保用户在将项目添加到数据库之前登录。

这是我插入项目的meteor方法

Meteor.methods({
    addItem : function(newItem) {
        var item = {
                time: new Date(),
                type: newItem.type
        }
        console.log("User ID: "+Meteor.userId());
        console.log("item: " +item);
        Item.insert(Meteor.userId(), item);
    }
});

我的允许陈述

Item.allow({
    insert: function(userId, item){
        return userId != null;
    }
})

控制台中的错误消息

I20150630-23:27:29.811(-4)? User ID: null
I20150630-23:27:29.912(-4)? item: [object Object]
I20150630-23:27:29.917(-4)? Exception in Mongo write: TypeError: object is not a
 function
I20150630-23:27:29.918(-4)?     at writeCallback (packages/mongo/mongo_driver.js
:313:1)
I20150630-23:27:29.918(-4)?     at Meteor.bindEnvironment.runWithEnvironment (pa
ckages/meteor/dynamics_nodejs.js:108:1)

编辑:

登录控制台打印后

I20150630-23:31:43.006(-4)? User ID: So9WoeueDJ6oEWkKf
I20150630-23:31:43.016(-4)? item: [object Object]
I20150630-23:31:43.018(-4)?     at Meteor.bindEnvironment.runWithEnvironment (pa
ckages/meteor/dynamics_nodejs.js:108:1)
I20150630-23:31:43.017(-4)?     at writeCallback (packages/mongo/mongo_driver.js
:313:1)
I20150630-23:31:43.017(-4)? Exception in Mongo write: TypeError: object is not a
 function

编辑2:

Item.allow({
    insert: function(userId, item){
        console.log("userId: "+userId);
        return userId != null;
    }
})

Meteor.methods({
    addItem : function(newItem) {
        var item = {
                time: new Date(),
                type: newItem.type
        }
        console.log("userID going into insert: "+Meteor.userId());
        Item.insert(item);
    }
});

输出

I20150701-00:11:56.267(-4)? userID going into insert: null

更重要的是,该项目已添加到数据库

3 个答案:

答案 0 :(得分:1)

http://docs.meteor.com/#/full/insert

CollectionName.insert将要插入的对象作为第一个参数,然后将回调函数作为第二个参数运行。

在你的代码中,你将一个字符串作为第一个参数,然后将一个对象作为第二个参数。这就是您收到消息object is not a function

的原因
Item.insert(Meteor.userId(), item);

做类似的事情:

if( Meteor.userId() ){
  // insert something
  Item.insert(item, function(error, idOfInsertedDocument){
    // do something if there is an error during insertion
    // or do something with the ID of the inserted document
  });
} else {
  // do something to notify the user that nothing can be inserted because there is no user
};

答案 1 :(得分:1)

所以问题结果是2折。

一,user_id没有传递给插入方法

二,允许/拒绝ONLY适用于客户端插入。

由于通常不好的做法是插入客户端(它更难以保护并向攻击者提供大量信息),最好只在Meteor.methods中执行逻辑操作。功能。

最终解决方案是执行以下操作:

Meteor.methods({
    addItem : function(newItem) {
        var item = {
                time: new Date(),
                type: newItem.type
        }
        if (Meteor.userId()){
            Item.insert(item);
        }
    }
});

答案 2 :(得分:0)

你误解了localStorage["foo"] = "value"; // is the same as: localStorage.setItem("foo", "value") // and var bar = localStorage["foo"]; // is the same as: var bar = localStorage.getItem("foo"); 的作用。它告诉客户端允许什么,什么不允许。此外,allow命令的签名与insert的签名不同,正如您所做的那样。

也就是说,解决方案是在客户端上执行插入操作:

allow

或者,如果你真的想通过一个方法来做,那么仍然只是放弃第一个参数。