简体   繁体   English

使用Joi验证重构HAPI配置

[英]Refactoring hapi configs with joi validation

I have hapi routes configs, which contains validation and I want to move this validation from config to file with validations for this model. 我有hapi路由配置,其中包含验证,并且我想将此验证从config移到带有此模型验证的文件。 For example for PATCH for users: 例如,针对用户的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
  }
}

On POST: 在POST上:

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

How you can see, for create and update used different fields. 您如何看到,用于创建和更新使用过的不同字段。 Also, I have routes, wich related to another model, like this: 另外,我有与其他模型相关的路线,如下所示:

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
      }
    }
  }
}

Only for model I can move to validator with structure: 仅对于模型,我可以转到具有以下结构的验证器:

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

But how include related routes? 但是如何包括相关路线? Because payload for PUT updateRelated is equivalent to PUT on this related models(ex: PUT /users/{user_id}/modelA equivalent PUT /modelA/{modelA_id}) 因为用于PUT updateRelated的有效负载等效于此相关模型上的PUT(例如:PUT / users / {user_id} / modelA等效PUT / modelA / {modelA_id})

Also, another endpoint can receive data for user model. 同样,另一个端点可以接收用户模型的数据。 For example: /me/coords can update coords field in user model, where payload will contain only latitude and longitude types. 例如:/ me / coords可以更新用户模型中的coords字段,其中有效负载将仅包含纬度和经度类型。

Thanks! 谢谢!

Create an export for your Id validation which would be common across multiple routes like 为您的ID验证创建导出,该导出在多个路由(例如,

const Joi = require('joi');

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

Then for each of your different payload validations create an export of for it. 然后为每个不同的有效负载验证创建一个导出。 ie

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()
      }
    }
});

Then require them in your route and use them as part of the validate object. 然后在您的路线中要求它们,并将它们用作validate对象的一部分。 ie

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