Ber*_*rry 15 javascript validation node.js joi
根据 Joi 文档,您可以Joi.object()像这样使用:
const object = Joi.object({
a: Joi.number().min(1).max(10).integer(),
b: Joi.any()
});
Run Code Online (Sandbox Code Playgroud)
但是你也可以Joi.object().keys()像这样写一个等效的代码:
const object = Joi.object().keys({
a: Joi.number().min(1).max(10).integer(),
b: Joi.any()
});
Run Code Online (Sandbox Code Playgroud)
两者有什么区别?
如果您只编写一次架构,则不需要使用.keys(). 正如他们的文档所说,.keys()在向对象添加更多行(键)时使用它是“有用的” 。
Joi.object().keys([schema]) notation这与 基本相同
Joi.object([schema]),但是Joi.object().keys([schema])当您想要添加更多键时(例如keys()多次调用), using更有用。如果只是添加一组key,可以跳过该keys()方法object()直接使用。有些人喜欢使用
keys()使代码更明确(这只是样式)。
摘自:https : //github.com/hapijs/joi/blob/v8.0.3/API.md#joiobjectkeysschema-notation
我也发现了这个:
使用 joi 的方法有很多。hapi 文档无法显示所有内容。仅在向对象添加键时才推荐调用 keys(),因为它会创建另一个模式
摘自:https : //github.com/hapijs/hapi/issues/2222
就像文档所述:
object.keys([模式])
设置 或 扩展允许的对象键,其中:
- schema - 可选对象,其中每个键都分配有一个 joi 类型对象。如果架构为 {},则不允许使用任何键。如果模式为空或未定义,则允许任何键。如果模式是带有键的对象,则这些键将添加到任何先前定义的键中(但如果先前允许所有键,则缩小选择范围)。
因此,通过调用Joi.object()您首先创建一个允许任何键的模式,然后通过调用.keys([schema])您扩展该模式(基本上与使用 定义新模式相同Joi.object([schema]))
所以这两个是等价的:
const a = Joi.object({ firstName: Joi.string() });
const b = Joi.object().keys({ firstName: Joi.string() });
Run Code Online (Sandbox Code Playgroud)
您还可以扩展上面创建的两个模式:
const aExtended = a.keys({ lastName: Joi.string() })
const bExtended = b.keys({ lastName: Joi.string() })
Run Code Online (Sandbox Code Playgroud)
就像前面的答案中所述,有时出于代码一致性的原因也会创建顶级模式.keys(),但最终我认为这是个人喜好的问题。
| 归档时间: |
|
| 查看次数: |
11329 次 |
| 最近记录: |