Hapijs Joi参考架构密钥以在其他模型或路由中重用

时间:2019-07-17 23:40:33

标签: validation routes schema joi hapi

我有一个这样构造的示例模型:

const MyModelResponse = Joi.object().keys({
  id: Joi.number().integer().required()
    .description('ID of the example model'),
  description: Joi.string()
    .description('Description of the example model'),
})
  .description('example instance of MyModel with the unique ID present')
  .label('MyModelResponse');

在我的路线中,我想确保对输入参数针对MyModeResponse的id属性进行了验证,如下所示:

     validate: {
        params: {
          id: MyModelResponse.id,
        },
        options: { presence: 'required' },
        failAction: failAction('request'),
      }

这会在服务器启动时导致架构验证错误:

AssertionError [ERR_ASSERTION]: Invalid schema content: (id)

是否有引用模式键的方法?目前,我必须诉诸以下任何一种情况:

根本不引用我的MyModelResponse模式:

     validate: {
        params: {
          id: Joi.number().integer().description('id of MyModel instance to get'),
        },
        options: { presence: 'required' },
        failAction: failAction('request'),
      }

通过这样定义我的模型,不使用Joi.object.keys()构造函数:

const MyModelResponse = {
  id: Joi.number().integer().required()
    .description('ID of the example model'),
  description: Joi.string()
    .description('Description of the example model'),
}

底部方法允许我在路由中引用id属性,但不允许我向架构添加描述和标签。我曾尝试在路线验证中使用MyModel.describe()。children.id,但尝试将id对象反序列化为架构对象无济于事。

任何建议将不胜感激。

1 个答案:

答案 0 :(得分:0)

删除keys()并按以下方式使用

const MyModelResponse = Joi.object({
  id: Joi.number().integer().required()
    .description('ID of the example model'),
  description: Joi.string()
    .description('Description of the example model'),
})
  .description('example instance of MyModel with the unique ID present')
  .label('MyModelResponse');