如何在流星中添加Autoform插入数据的额外字段?

时间:2015-05-19 17:32:13

标签: meteor meteorite meteor-blaze meteor-autoform meteor-collection2

我在流星中使用Autoform和Collection2包。我正在尝试使用插入的数据存储当前登录的userId。这样做的正确方法是什么?

// both/collections/myCollection.js

MyCollection = new Mongo.Collection("mycollection");

MyCollection.attachSchema(new SimpleSchema({
    fname : {
        type: String,
        label: "First Name"
    },
    lname : {
        type: String,
        label: "Last Name",
    }
}));

MyCollection.allow({
    insert: function(userId, doc){
        return doc && doc.userId === userId;
    },
    update: function(userId, doc){
        return doc && doc.userId === userId;
    }
})

myTemplate.html

// client/myTemplate.html

<template name="myTemplate">
    {{> quickForm collection="MyCollection" id="insertMyData" type="insert"}}
</template>

myTemplate.js

// client/myTemplate.js

Template.myTemplate.created = function(){

    var postHooks = {
        before: {
            insert: function(doc) {
                if(Meteor.userId()){
                    doc.userId = Meteor.userId();
                }
                return doc;
            }
        }
    }
 AutoForm.addHooks('insertMyData', postHooks);
 }

我删除了不安全的软件包并尝试使用允许/拒绝编写数据(link)但现在我收到的错误如下:

Meteor.makeErrorType.errorClass {error: 403, reason: "Access denied", details: undefined, message: "Access denied [403]", errorType: "Meteor.Error"…} 

通常Autoform存储数据,如:

{
    "_id" : "r4uskTttNzADnhZjN",
    "fname" : "firstName",
    "lname" : "lastName"
}

我想存储像:

{
    "_id" : "r4uskTttNzADnhZjN",
    "fname" : "firstName",
    "lname" : "lastName"
    "currentUser" : "lsgNynHDrM4Dv9wpH"
}

2 个答案:

答案 0 :(得分:0)

使用允许规则执行此操作可能更好。您还可以获得安全性的好处,能够非常确定地确保现场的正确性。

MyCollection.allow({
    insert: function(userId, doc){
        doc.currentUser = userId;
        return true;
    },
    update: function(userId, doc){
        return doc && doc.currentUser === userId;
    }
});

要严格解决您的问题,应该这样做:

MyCollection.allow({
    insert: function(userId, doc){
        return doc && doc.currentUser === userId;
    },
    update: function(userId, doc){
        return doc && doc.currentUser === userId;
    }
})

答案 1 :(得分:0)

这是合乎逻辑的,因为您不想将任何额外的属性注入您的mongo集合中,所以:

根据官方收藏2 doc

您必须添加过滤器选项以跳过验证这些额外字段

然而,这会在插入doc

时引起另一个可理解的问题
"insert failed: Error: undefined is not allowed by the schema"

最终我得到它与这个

一起工作
MyCollection.insert(task, { validate: false, filter: false });

重要的: 请务必先调用check方法!

这是一个使用Meteor方法验证和重定向的完整工作示例:

客户端

AutoForm.addHooks('taskSubmit', {
  onSubmit: function (insertDoc, updateDoc, currentDoc) {
    Meteor.call('taskInsert', insertDoc, function(error, result) {
      if (error) {
        Errors.throw(error.reason);
      }
      Router.go('taskPage', {_id: result._id});  
    });

    return false;
  }
});

服务器端

Tasks = new Mongo.Collection('tasks');

Tasks.attachSchema(taskSchema = new SimpleSchema({
  title: {
    type: String,
    label: "Title"
  },
  body: {
    type: String,
    label: "Description",
    autoform: {
        type: "textarea"
    }
  }
 }
));
Meteor.methods({
  taskInsert: function(task) {
    check(task, Tasks.simpleSchema());

    var user = Meteor.user();
    var task = _.extend(task, {
      userId: user._id, 
      author: user.username,
      submitted: new Date(),
      commentsCount: 0,
      progress: 0
    });

    var id = Tasks.insert(task, { filter: false });

    return {
      _id: id
    };
  }
});

希望这有助于某人