2016-11-28 113 views
0

在流星網絡應用程序中,同時存在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); 
    } 
}); 

對於這個簡單的例子,這將是 「OK」 重寫a_field:String到驗證方法的Schema。然而,對於更復雜的示例,這似乎相當多餘,如果我想使用一些先前定義的模式並添加一些新的字段進行驗證,而不必複製整個事情,那又如何呢?

+0

簡單模式綁定到集合時負責在客戶端以及從服務器進行驗證。由於客戶端驗證一般不受信任,驗證再次發生在服務器端(視爲可信)。您可以查看[簡單模式驗證器](https://github.com/aldeed/meteor-simple-schema#validation-options)。 – blueren

回答

1

我有同樣的問題,因爲你之前,這是我做的:

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) { 
    // ... 
    } 
}); 
0

爲了完整起見,這是我最終使用的,儘管從上面很自然答案(不同之處在於我使用Schema本身而不是從集合中檢索它):

import {mySchema, myCollection} from mycollection.js; 

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