繁体   English   中英

使用Joi验证重构HAPI配置

[英]Refactoring hapi configs with joi validation

我有hapi路由配置,其中包含验证,并且我想将此验证从config移到带有此模型验证的文件。 例如,针对用户的PATCH:

const routeConfig = {
  method: 'PATCH',
  path: '/users/{id}',
  config: {
    ...
    validate: {
      params: {
        id: Joi.string().required()
      },
      payload: {
        email: Joi.string().email().optional(),
        password: Joi.string().optional(),
        fieldA: Joi.string().optional(),
        fieldB: {
          fieldB1: Joi.string().optional(),
          fieldB2: Joi.string().optional(),
          fieldB3: Joi.string().uri().optional(),
          fieldB4: Joi.string().uri().optional(),
          fieldB5: {
            fieldB6: Joi.string().optional(),
            fieldB7: Joi.string().optional(),
            fieldB8: Joi.string().optional()
          }
        }
      }
    },
    handler
  }
}

在POST上:

const routeConfig = {
  method: 'POST',
  path: '/users',
  config: {
    ...
    validate: {
      email: Joi.string().email().required(),
      password: Joi.string().required(),
      confirmPassword: Joi.string().required()
    },
    handler
  }
}

您如何看到,用于创建和更新使用过的不同字段。 另外,我有与其他模型相关的路线,如下所示:

const routeConfig = {
  method: 'PUT',
  path: '/users/{id}/updateRelated',
  config: {
    validate: {
      params: {
        id: Joi.string().required()
      },
      payload: {
        relatedId: Joi.string().required(),
        relatedModelFieldA: Joi.string().required(),
        relatedModelFieldB: Joi.string().required(),
        relatedModelFieldC: Joi.string().required(),
        ... 10 fields
      }
    }
  }
}

仅对于模型,我可以转到具有以下结构的验证器:

const validationSchemas = {
  'post-users': {
    payload: ...
  }
  'patch-users': {
    params: ...,
    payload: ...
  },
  ...
}

但是如何包括相关路线? 因为用于PUT updateRelated的有效负载等效于此相关模型上的PUT(例如:PUT / users / {user_id} / modelA等效PUT / modelA / {modelA_id})

同样,另一个端点可以接收用户模型的数据。 例如:/ me / coords可以更新用户模型中的coords字段,其中有效负载将仅包含纬度和经度类型。

谢谢!

为您的ID验证创建导出,该导出在多个路由(例如,

const Joi = require('joi');

module.exports = Joi.object({
   id: Joi.string().required()
});

然后为每个不同的有效负载验证创建一个导出。

const Joi = require('joi');

module.exports = Joi.object({
    email: Joi.string().email().optional(),
    password: Joi.string().optional(),
    fieldA: Joi.string().optional(),
    fieldB: {
      fieldB1: Joi.string().optional(),
      fieldB2: Joi.string().optional(),
      fieldB3: Joi.string().uri().optional(),
      fieldB4: Joi.string().uri().optional(),
      fieldB5: {
        fieldB6: Joi.string().optional(),
        fieldB7: Joi.string().optional(),
        fieldB8: Joi.string().optional()
      }
    }
});

然后在您的路线中要求它们,并将它们用作validate对象的一部分。

const idParamsSchema = require('./id-param-schema');
const payloadSchema = require('./payload-schema');

...

const routeConfig = {
  method: 'PUT',
  path: '/users/{id}/updateRelated',
  config: {
     validate: {
        params: idParamsSchema,
        payload: payloadSchema
     }
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM