簡體   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