Я использую метеорит с SimpleSchema и Collection2. И реагируйте. Я столкнулся с ошибкой при вставке элемента в коллекцию. вот код:Ошибка при вставке в коллекцию в Meteor
моей коллекции и схемы в 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 метод компонента Я получаю значения входов (имя и desc), а затем вызываю Meteor.call('recipes.insert', name, desc);
. Я хочу, чтобы поле Author and CreatedBy создавалось автоматически на сервере с помощью простой схемы autoValue.
Но у меня есть ошибка всегда, когда я пытаюсь что-то вставка с формой:
insert failed: Error: Author is required
Я пытался добавить этот код в recipe.insert метода:
let newRecipe = {
name,
description: desc,
}
RecipeSchema.clean(newRecipe);
Recipes.insert(newRecipe);
Но это не сработало. И в официальных документах простой схемы я обнаружил, что не является необходимым:
NOTE: The Collection2 package always calls clean before every insert, update, or upsert.
Я решил эту проблему, добавив optional: true
к полям Author
и CreatedAt
в моем RecipeSchema. поэтому код для поля автора:
author: {
type: String,
optional: true,
autoValue: function() {
return this.userId;
},
},
Но я не хочу, чтобы эти поля были необязательными. Я просто хочу autoValue
работ, и эти поля будут заполнены нужными значениями. Кто знает, почему эта ошибка возникает и как ее решить?
Update
я заметил один важный момент. Я вставил разные рецепты с моей формой (я думаю, что работает неправильно из-за optional: true
). когда я бегу meteor mongo
> `db.recipes.findOne()» и получить различные Recipies, я получаю объекты, подобные этим:
meteor:PRIMARY> db.recipes.findOne()
{
"_id" : "RPhPALKtC7dXdzbeF",
"name" : "Hi",
"description" : "hiodw",
"author" : null,
"createdAt" : ISODate("2016-05-12T17:57:15.585Z")
}
Так что я не знаю, почему, но поля Автор и CreatedBy заполнены правильно (автор : null beacuse у меня еще нет учетной системы). но таким образом, в чем смысл и optinal в схеме? это мое решение (с optional: true
) правильно?
обновление 2
еще один важный момент! Я удалил поле author
из схемы. и удалил optional:true
с поля createdBy
. и это работает! tithout optional true. Я понял, что фактическая проблема заключается в ** авторском поле * схемы. но ЧТО это проблема?
По умолчанию требуются все ключи. Установите опцию: true, чтобы изменить это. – muetzerich
Я уже писал, что решил эту проблему. но я не понимаю смысла этого. –
странная ситуация, что он даже работает без дополнительного: true! необходимо удалить поле автора - и это работает! –