在我能找到的关于使用 JSON 模式的内容中,描述有效数据、验证存储数据和验证输入数据的任务似乎存在混淆(或至少缺乏区别)。
一个典型的例子如下:
var schema = {
type: 'object',
properties: {
id: { type: 'integer', required: true },
name: { type: 'string', required: true },
description: { type: 'string', required: false }
}
};
这适用于描述数据存储中的有效数据应该是什么样子,因此也可以验证它(后者并不是非常有用——如果它在存储中它应该已经有效):
var storedData = {
id: 123,
name: 'orange',
description: 'delicious'
};
它不能很好地验证输入。id
最有可能留给应用程序生成,而不是让用户作为输入的一部分提供。以下输入未通过验证,因为它缺少id
架构声明的内容required
:
var inputData = {
name: 'orange',
description: 'delicious'
};
好吧,有人可能会说,模式并不意味着验证直接输入,验证应该只在应用程序添加后进行id
,并且数据就是要存储的内容。
但是,如果模式不是为了验证直接输入,那么 1)在浏览器中运行的 JavaScript 验证器的意义是什么,可能是直接输入和 2)readonly
规范中明显面向输入的模式特性的意义是什么?
当考虑可以设置一次但不能更新的属性(如用户名)以及不同的访问级别(例如,管理员和橙色的所有者应该能够更改description
,而对于其他用户应该留readonly
)。
处理此问题的最佳(或至少有效)做法是什么?每个用例都有不同的架构,如下所示?
var baseSchema = {
type: 'object',
properties: {
id: { type: 'integer', required: true },
name: { type: 'string', required: true },
description: { type: 'string', required: false }
}
};
var ownerUpdateSchema = {
type: 'object',
properties: {
id: { type: 'integer', required: false, readonly: true },
name: { type: 'string', required: true },
description: { type: 'string', required: false }
}
};
var userUpdateSchema = {
type: 'object',
properties: {
id: { type: 'integer', required: false, readonly: true },
name: { type: 'string', required: false, readonly: true },
description: { type: 'string', required: false, readonly: true }
}
};
或者是其他东西?