4

У меня есть форма вставки, которая создается с использованием autoform, collection2 и простой схемы. Поле createdBy заполняется с помощью userId с использованием autovalue. Форма работала при использовании meteor.allow() для вставки, но я хотел заменить allow с помощью метода, чтобы я мог выполнить некоторую проверку пользовательских ролей, т. Е. Убедитесь, что у пользователя есть права администратора. Но теперь я получаю сообщение об ошибке, что поле createdBy пусто.AutoValue не установлен в AutoForm с методом Meteor

Ошибка в Дев инструментов:

error: 400, reason: "Created by is required", details: undefined, message: "Created by is required [400]", errorType: "Meteor.Error"}

Courses = new Mongo.Collection('Courses'); 

courseSchema = new SimpleSchema({ 
    title: { 
     type: String, 
     label: "Course Title" 
    }, 
    description: { 
     type: String, 
     label: "Description" 
    }, 
    createdAt: { 
     type: Date, 
     autoValue: function(){ 
      return new Date(); 
     }, 
     autoform:{ 
      type: 'hidden' 
     } 
    }, 
    startDate:{ 
     type: String, 
     label: "Start Date" 
    }, 
    sessions: { 
     type: String, 
     label: "No. of sessions" 
    }, 
    duration: { 
     type: String, 
     label: "Duration of the course" 
    }, 
    price: { 
     type: String, 
     label: "Course Price" 
    }, 
    createdBy:{ 
     type: String, 
     autoValue:function(){ 
      return this.userId; 
     }, 
     autoform:{ 
      type:'hidden' 
     } 
    } 
}); 

Courses.attachSchema(courseSchema); 

Метод (который доступен на клиенте и на сервере):

Meteor.methods({ 
    addCourse: function(course){ 
     Courses.insert(course); 
    } 
}); 

и шаблон, где генерируется форма :

<template name="adminIndex"> 
    <h1>Available Courses</h1> 
    {{> courseList }}  
    <button type="button" class="btn btn-success btn-block">Create New Course</button> 
    <h3>Create New Course</h3> 
    {{>quickForm id="InsertCourseForm" collection="Courses" type="method" meteormethod="addCourse"}} 
</template> 

ответ

1

Вы n чтобы очистить объект, вызвав метод Courses.simpleSchema().clean(course); в методе сервера, чтобы надежно добавить значения auto и default. Также обратите внимание, что this.userId в вашей функции autoValue является null для инициированных сервером действий, поэтому вы, вероятно, захотите его заменить Meteor.userId().

Кроме того, вы должны выполнить свою собственную проверку путем вызова метода check(value, pattern) в методе Метеор, поскольку проверка на стороне клиента может быть обойдена.

Например:

if (Meteor.isServer) { 
    Meteor.methods({ 
    addCourse: function(course) { 
     Courses.simpleSchema().clean(course); 
     check(course, Courses.simpleSchema()); 
     Courses.insert(course); 
    } 
    }); 
} 
+0

Thanks Matthias. Вопрос о том, что код, доступный клиенту и серверу для оптимистического пользовательского интерфейса, имеет смысл, но мне было любопытно, что this.userId и Meteor.userId. Я не уверен, где на самом деле выполняется код, клиент или сервер или оба, я думаю. Я предполагаю, что заглушка метода проверяет локально перед обновлением кэша minimingo до того, как он будет проверяться на сервере до обновления mongo db. Где автоматически запускается autoValue? Я предположил на клиенте, а затем детали были «отправлены» (по HTTP-мышлению) на сервер. Это точно? –

+0

Схема будет проверена как на клиенте, так и на сервере. Вы можете проверить это, добавив 'console.log (this.userId);' внутри вашей функции autoValue', и вы увидите идентификатор пользователя в консоли браузера и 'null' на консоли сервера. –

+0

Это имеет смысл, но теперь я очень смущен тем, что делает autoValue. Я бы подумал, что он заполнит элемент формы, и userId затем будет «отправлен» на сервер в виде данных формы. В противном случае, в чем смысл использования autoValue. почему бы просто не добавить userId к полученным данным в методе, прежде чем вставлять данные в db? Я буду читать на быстрой форме. –

1

Так это работало, но я не видел его использовать в любых других примерах, так у меня плохое чувство, но пока я не могу узнать больше это придется делать:

createdBy:{ 
    type: String, 
    autoValue:function(){ 
     if(Meteor.isClient){ 
      return this.userId; 
     }else if(Meteor.isServer){ 
      return Meteor.userId(); 
     } 
    }, 
+0

это было совсем не так, ответ от Маттиаса выше работал. –

Смежные вопросы