Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

221
Vistas
¿Cómo puedo proporcionar una validación predeterminada para todas las instancias de un SchemaType mangosta personalizado?

He seguido la documentación de mongoose para crear tipos de esquema personalizados . Mi implementación es funcional, pero no produce los resultados que me gustaría.

Mi objetivo es tener un schemaType personalizado que proporcione un mensaje de error personalizado cuando la conversión falla (o cuando la conversión tiene éxito pero la validación falla), sin tener que declarar un método de validación cada vez que se usa el tipo de datos en los esquemas de mi API.

Aquí hay un ejemplo (intentaré explicarlo en los comentarios):

 const mongoose = require('mongoose') // Create Custom Schema Type class UUIDv4 extends mongoose.SchemaType { constructor(key, options) { super(key, options, 'UUIDv4'); } cast(val) { if (/*Do UUIDv4 validation check here*/) { /* Because of the way mongoose works, this error message is difficult to present to a user because the built-in casting error message is always used at the top level. */ throw new Error(`${val} is not a valid version 4 UUID`); } return val; } } // Add `UUIDv4` to the type registry mongoose.Schema.Types.UUIDv4 = UUIDv4; const entitySchema = new mongoose.Schema({ entityKey: { type: UUIDv4, required: true } }) const Entity = mongoose.model('Entity', entitySchema) const testEntity = new Entity({ entityKey: "123456789" }) testEntity.save().then(() => { console.log('done') }).catch((e) => { console.log(e.errors.entityKey.reason.message) // This is where the custom message can be found })

Obviamente, podría omitir la creación del SchemaType personalizado, pero esperaba evitar tener que especificar un validador personalizado cada vez que se usa una entidadEntityKey en mis esquemas (se usan mucho).

 const UUIDv4Validator = { validator: function(v) { // If is valid. . . return true // else return false }, message: 'Invalid UUIDv4' } const entitySchema = new mongoose.Schema({ entityKey: { type: String, required: true, validate: UUIDv4Validator // I don't want to have to do this every time } })

Sé que podría mantener el tipo de esquema personalizado y verificar la existencia de este error en mis declaraciones de prueba/captura usando el operador de encadenamiento opcional, pero preferiría evitar la necesidad, ya que será repetitivo:

 try { // do stuff . . . await testEntity.save() } catch (e) { const message = e?.errors?.entityKey?.reason?.message ?? e.message. // No thank you! // do stuff . . . }

Intenté leer la documentación para aprender a crear un método de validación personalizado para tipos de esquema personalizados, pero no logré que funcionara y hasta ahora no he encontrado ejemplos en línea.

¿Cómo puedo tener un validador personalizado vinculado permanentemente a mi tipo de esquema personalizado UUIDv4 que evaluará los datos que se intentan guardar y, cuando corresponda, devolverá mi mensaje de error personalizado?

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Encontré la respuesta siguiendo el enlace en la documentación de mongoose SchemaTypes y buscando en el código fuente de algunos de los complementos de mongoose.

Esencialmente, para crear un validador personalizado que se aplique universalmente a todas las instancias de un SchemaType mongoose, se debe pasar un validador directamente al método de validación() del SchemaType.

Dentro de una definición de clase SchemaType personalizada, se puede hacer llamando al método de validación del super dentro del constructor de la clase. Aquí hay un ejemplo:

 class UUIDv4 extends mongoose.SchemaType { constructor(key, options) { super(key, options, 'UUIDv4'); // Call the validate method of super and pass in a validator // function and a message to return when validation fails this.validate(function(val){ return isUUIDv4(val) // Example UUIDv4 validation check }, '{PATH}: "{VALUE}" is not a valid version 4 UUID') } // Other class methods such as cast(), etc. . . }

Como se muestra en la documentación (y en mi pregunta original), los validadores de mangosta aceptan un objeto {} que contiene un validator y un message . Aunque se agregan con frecuencia a un esquema para proporcionar una validación personalizada para un campo/ruta específico, se pueden agregar a la validación general de un tipo de esquema llamando a SchemaType.validate() (donde SchemaType se reemplaza por el nombre real de SchemaType, es decir, String) y pasando una función de validación y un mensaje como dos parámetros separados.

Para aquellos que trabajan con SchemaTypes personalizados, como en mi caso de uso, es posible obtener el mensaje de error deseado del validador haciendo que el método cast() siempre devuelva verdadero, y solo manejando la validación en save() .

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda