Как избежать избыточности при использовании SimpleSchema и ValidatedMethod для коллекции метеоров?

В метеорном веб-приложении есть ли избыточность SimpleSchema и ValidatedMethod? При попытке повторно использовать ранее определенную схему я получаю синтаксическую ошибку.

Вот что я имею в виду: mycollection.js

export const myCollection = new Mongo.Collection('myCollection');

export const mySchema = new SimpleSchema({
   a_field:String;
});

myCollection.attachSchema(mySchema); 

Теперь о методе вставки: methods.js

import {mySchema, myCollection} from mycollection.js;

export const insertMethod = new ValidatedMethod({
    name:'insertMethod',
    validate:new SimpleSchema({ 
        mySchema,           /*Shows a syntax error: How to avoid repeating the schema?*/
    }).validator(),
    run(args){
        myCollection.insert(args);
    }
});

Для этого простого примера было бы нормально переписать a_field:String в схему проверенного метода. Однако для более сложных примеров это кажется довольно избыточным, и что, если я хочу использовать некоторые из ранее определенных схем и добавить несколько новых полей для проверки без необходимости копировать все это?


person EugVal    schedule 28.11.2016    source источник
comment
Простая схема при привязке к коллекции обеспечивает проверку как на клиенте, так и на сервере. Поскольку проверки на стороне клиента, как правило, не вызывают доверия, проверки снова выполняются на стороне сервера (который считается доверенным). Вместо этого вы можете использовать простые средства проверки схемы.   -  person blueren    schedule 28.11.2016


Ответы (2)


У меня была та же проблема, что и у вас раньше, вот что я сделал:

import { ValidatedMethod } from 'meteor/mdg:validated-method';
import { Reviews } from '../../Reviews/Reviews.js';

export const insertReview = new ValidatedMethod({
  name: 'insertReview',
  validate: Reviews.simpleSchema().validator(),
  run(data) {
    // ...
  }
});

Если вам нужно исключить некоторые поля:

import { ValidatedMethod } from 'meteor/mdg:validated-method';
import { Reviews } from '../../Reviews/Reviews.js';

const newReviewsSchema = Reviews.simpleSchema().omit([
  'field1',
  'field2',
]);

export const insertReview = new ValidatedMethod({
  name: 'insertReview',
  validate: newReviewsSchema.validator(),
  run(data) {
    // ...
  }
});

И когда вам нужно расширить схему:

import { ValidatedMethod } from 'meteor/mdg:validated-method';
import { Reviews } from '../../Reviews/Reviews.js';

export const insertReview = new ValidatedMethod({
  name: 'insertReview',
  validate: new SimpleSchema([
    Reviews.simpleSchema(),
    new SimpleSchema({
      newField: {
        type: String,
      }
    }),
  ]).validator(),
  run(data) {
    // ...
  }
});
person kkkkkkk    schedule 28.11.2016

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

import {mySchema, myCollection} from mycollection.js;

export const insertMethod = new ValidatedMethod({
    name:'insertMethod',
    validate:new SimpleSchema([ 
        mySchema,          
    ]).validator(),
    run(args){
        myCollection.insert(args);
    }
});
person EugVal    schedule 01.12.2016