Joi.object() 和 Joi.object().keys() 有什么区别?

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)

两者有什么区别?

Luk*_*own 7

如果您只编写一次架构,则不需要使用.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


Tar*_*maa 5

就像文档所述:

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(),但最终我认为这是个人喜好的问题。