Я использую метеор с SimpleSchema и Collection2. И реагировать. Я столкнулся с ошибкой при вставке элемента в коллекцию. вот код:
моя коллекция и схема в recipes.js:
import { Meteor } from 'meteor/meteor';
import { Mongo } from 'meteor/mongo';
import { SimpleSchema } from 'meteor/aldeed:simple-schema';
export const Recipes = new Mongo.Collection('recipes');
Recipes.deny({
insert() { return true; },
update() { return true; },
remove() { return true; },
});
RecipeSchema = new SimpleSchema({
name: {
type: String,
},
description: {
type: String,
},
author: {
type: String,
autoValue: function() {
return Meteor.userId();
},
},
createdAt: {
type: Date,
autoValue: function() {
if(Meteor.isClient){
return this.userId;
} else if(Meteor.isServer){
return Meteor.userId();
}
},
}
});
Recipes.attachSchema(RecipeSchema);
Код моих методов в Methods.js
import { Meteor } from 'meteor/meteor';
import { Mongo } from 'meteor/mongo';
import { SimpleSchema } from 'meteor/aldeed:simple-schema';
import { Recipes } from './recipes.js';
Meteor.methods({
'recipes.insert'(name, desc) {
new SimpleSchema({
name: { type: String },
desc: { type: String },
}).validate({ name, desc });
Recipes.insert({
name,
description: desc,
});
}
});
И в файле AddRecipeForm.jsx в методе handleSubmit компонента я получаю значения входных данных (имя и описание) и затем вызываю Meteor.call('recipes.insert', name, desc);
. Я хочу, чтобы поля Author и CreatedBy автоматически создавались на сервере с простой схемой autoValue.
Но у меня всегда возникает ошибка, когда я пытаюсь что-то вставить в форму:
вставка не удалась: ошибка: требуется автор
Я попытался добавить этот код в метод recipe.insert:
let newRecipe = {
name,
description: desc,
}
RecipeSchema.clean(newRecipe);
Recipes.insert(newRecipe);
Но это не сработало. И в официальных документах с простой схемой я обнаружил, что это не обязательно:
ПРИМЕЧАНИЕ. Пакет Collection2 всегда вызывает clean перед каждой вставкой, обновлением или обновлением.
Я решил эту проблему, добавив optional: true
в поля Author
и CreatedAt
в моей RecipeSchema. поэтому код для поля автора:
author: {
type: String,
optional: true,
autoValue: function() {
return this.userId;
},
},
Но я не хочу, чтобы эти поля были необязательными. Я просто хочу, чтобы autoValue
работало, и эти поля были заполнены правильными значениями. Кто знает, почему возникает эта ошибка и как ее решить?
Обновить
Я заметил один важный момент. Я вставил разные рецепты в свою форму (которые, как мне кажется, работают неправильно из-за optional: true
). когда я запускаю meteor mongo
> `db.recipes.findOne()' и получаю разные рецепты, я получаю такие объекты:
meteor:PRIMARY> db.recipes.findOne()
{
"_id" : "RPhPALKtC7dXdzbeF",
"name" : "Hi",
"description" : "hiodw",
"author" : null,
"createdAt" : ISODate("2016-05-12T17:57:15.585Z")
}
Так что я не знаю почему, но поля Author и CreatedBy заполнены правильно (автор: null, потому что у меня еще нет системы учетных записей). но таким образом, каково значение required и optinal в схеме? правильно ли мое решение (с optional: true
)?
обновление 2
еще важный момент! я удалил поле author
из схемы. и удалил optional:true
из поля createdBy
. и это работает! без опционального true. Я понял, что проблема в **поле автора* схемы. а в чем проблема?