Miré un código base existente y noté que el código base tenía dos validaciones de esquema para lo que siento que un solo esquema podría validar ya que el segundo esquema es una rama del primero. Consulte la base de código a continuación.
export const StudentSchema = Joi.object().keys({ _id, name, dob, gender, grade }); export const StudentUpdateSchema = Joi.object().keys({ name, dob, })Ahora estos esquemas se están utilizando en las siguientes rutas:
//CREATE ROUTE { method: 'POST', path: '/students/{id}', handler: async (request) => { const { id } = request.params; return Student.create(id, request.payload); }, options: { ...sharedOptions, description: 'Enrolling a student', validate: { failAction, payload: StudentSchema, params: { studentId: Joi.objectId().required() }, }, response: { status: { 200: StudentSchema, 400: Joi.any(), }, }, }, }, // UPDATE ROUTE { method: 'PUT', path: '/students/{id}', handler: async (request) => { const { id } = request.params; return Student.update(Id, { $set: request.payload }); }, options: { ...sharedOptions, description: 'Update student details', validate: { failAction, payload: StudentUpdateSchema, params: { studentId: Joi.objectId().required(), }, }, response: { status: { 200: StudentSchema, 400: Joi.any(), 404: Joi.any(), }, }, }, }Soy nuevo en Hapi pero tengo algo de experiencia con Express y Mongoose y me inclino a volver a escribir estas validaciones para usar ÚNICAMENTE StudentSchema en el método 'POST' y 'PUT' ya que StudentSchema contiene todo lo que se requiere para manejar ambos la función de creación y actualización.
¿Alguien con experiencia en HapiJS puede validar las ventajas y desventajas de usar un solo objeto de esquema (en este caso, StudentSchema) o debo continuar con el paradigma actual de usar los dos esquemas?
Yo diría que este patrón de diseño es la mejor práctica. En una actualización parcial, debe tener un esquema adecuado para representar mejor el objeto entrante. Sin embargo, puede evitar los dos esquemas conservando el concepto detrás de ellos al extender el primero usando las claves opcionales .
const createSchema = Joi.object().keys({ _id: Joi.objectId(), name: Joi.string().required(), dob: Joi.string().required(), gender: Joi.string().required(), grade: Joi.number().required() }); const updateSchema = createSchema.optionalKeys("gender", "grade", "_id"); Joi.validate({name: "this fails"}, createSchema); // error: required fields missing Joi.validate({name: "this works"}, updateSchema);De esta manera, tiene un esquema completo que lo protege al mismo tiempo que permite una actualización de campo parcial.