0

Я использую пакет 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" 
} 

ответ

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; 
    } 
}) 
+0

Я попытался с этой штукой, но такая же ошибка наступает «Доступ запрещен [403]». я принимаю ** «MyCollection.allow ({...})» ** и ** «var postHooks = {...} AutoForm.addHooks (....)" ** находится в нужном месте. это? – iamhimadri

0

Это логично, так как вам не нравится вводить какие-либо дополнительные свойства вашей коллекции Монго так:

Согласно официальный сбор2 doc

вы должны добавить опцию фильтра, чтобы пропустить проверку этого дополнительного поля

однако эта причина другая проблема понятна при вставке док

"insert failed: Error: undefined is not allowed by the schema" 

Finaly я заставить его работать с этим

MyCollection.insert(task, { validate: false, filter: false }); 

Важно: Убедитесь, что вы вызываете метод проверки, прежде чем!

Это полный рабочий пример с проверкой и перенаправлять с использованием методов Метеора:

сторона клиента

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 
    }; 
    } 
}); 

Надеется, что это поможет кому-то