定义一个图式
然而MongoDB是一种无结构的数据库,允许数据结构最大限度的灵活性,通常最好使用一个视图来约束集合中的内容符合已知的格式。如果你不这么做的话,那么最终你需要去编写防卫代码来检查并确认你的数据结构,这将用于读取数据库,而不是写入数据库。大多数情况下,你会倾向于读取属于较写入更为频繁,所以当使用图式写入数据时通常会更简单,也很少会产生Bug。
在Meteor中,aldeed:simple-schema是一款杰出的图式包。它是一款富有表现力且基于MongoDB的图示,用于插入和更新文档。
使用simple-schema
来编写一个图示,你可以轻松的创建一个基于SimpleSchema
类的新实例:
Lists.schema = new SimpleSchema({
name: {type: String},
incompleteCount: {type: Number, defaultValue: 0},
userId: {type: String, regEx: SimpleSchema.RegEx.Id, optional: true}
});
这个Todos应用中的例子用一些简单的规则定义了一个图式:
- 我们指定列表中的
name
字段是必选项,必须是一个字符串。 - 我们指定
incompleteCount
是一个数字类型,在没有要求的情况下插入时设置为0
。 - 我们制定
userId
是可选项,必须是一个字符型,让其看起来像用户文档中的ID。
我们直接在叫做Lists
的命名空间上附加图式,允许我们随时依靠图式检查对象,如同一个表单或者方法。在下一章节中,我们将了解到,当向集合中写入数据时如何自动化地使用这个图式。
你能看到我们用相对少的代码限制大量list的格式。你可以在Simple-Schema文档中阅读更多详尽操作。
验证图式
现在我们有了一个图示,那如何去使用它?
用图示来验证一个文档是相当简单的。我们可以这么写:
const list = {
name: 'My list',
incompleteCount: 3
};
Lists.schema.validate(list);
在这个例子中,list依照图式来进行验证,执行validate()
方法是没有问题的。然后如果我们这么写:
const list = {
name: 'My list',
incompleteCount: 3,
madeUpField: 'this should not be here'
};
Lists.schema.validate(list);
当调用validate()
时将抛出验证错误(ValidationError)
,包含关于list
文档的错误细节。
`验证错误(ValidationError)`
[验证错误](https://github.com/meteor/validation-error/)
是什么?它是一种在Meteor中用于在修改集合时指出基于用户输入的错误。通常,一个验证错误ValidationError
的细节被用来标识那些不符合图式定义的输入信息。我们将在方法相关的文章中了解更多验证错误
如何工作的细节。