У меня есть форма вставки, которая создается с использованием 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>
Thanks Matthias. Вопрос о том, что код, доступный клиенту и серверу для оптимистического пользовательского интерфейса, имеет смысл, но мне было любопытно, что this.userId и Meteor.userId. Я не уверен, где на самом деле выполняется код, клиент или сервер или оба, я думаю. Я предполагаю, что заглушка метода проверяет локально перед обновлением кэша minimingo до того, как он будет проверяться на сервере до обновления mongo db. Где автоматически запускается autoValue? Я предположил на клиенте, а затем детали были «отправлены» (по HTTP-мышлению) на сервер. Это точно? –
Схема будет проверена как на клиенте, так и на сервере. Вы можете проверить это, добавив 'console.log (this.userId);' внутри вашей функции autoValue', и вы увидите идентификатор пользователя в консоли браузера и 'null' на консоли сервера. –
Это имеет смысл, но теперь я очень смущен тем, что делает autoValue. Я бы подумал, что он заполнит элемент формы, и userId затем будет «отправлен» на сервер в виде данных формы. В противном случае, в чем смысл использования autoValue. почему бы просто не добавить userId к полученным данным в методе, прежде чем вставлять данные в db? Я буду читать на быстрой форме. –