Traté de encontrar la respuesta a esta pregunta en todas partes, pero parece que no tuve suerte.
Tengo un modelo de mangosta muy simple.
var userObject = { profile: { username: { type: String, required: true, lowercase: true }, firstname: { type: String, required: true }, lastname: { type: String, required: true }, img: { type: String, required: true, match: /^(https?:\/\/)/i }, email: { type: String, match: /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/, required: true }, singupdate: { type: Date, default: Date.now } } };Y, cuando creo el esquema, elijo la opción para arrojar un error cuando agrego propiedades que no están en el modelo.
new mongoose.Schema(userObject, { strict: "throw" });Así es como traté de detectar el error. Cuando agrego propiedades válidas, el proceso se ejecuta y recibo los documentos creados, pero cuando agrego propiedades no válidas, el proceso nunca se cierra y los registros nunca aparecen en la consola.
try { User.create(users, function(err, docs) { console.log("err: " + err); console.log("docs: " + docs); }); } catch (e) { console.log(e.message); }¿Qué estoy haciendo mal?
Los documentos dicen:
https://mongoosejs.com/docs/guide.html#strict
La opción estricta (habilitada de forma predeterminada) garantiza que los valores pasados a nuestro constructor de modelos que no se especificaron en nuestro esquema no se guarden en la base de datos.
La opción estricta también se puede configurar para "lanzar", lo que provocará que se produzcan errores en lugar de descartar los datos incorrectos.
NOTA: Cualquier clave/valor establecida en la instancia que no exista en su esquema siempre se ignora, independientemente de la opción de esquema.
Entonces, 'Datos incorrectos' solo abarca datos que están en el esquema pero en un formato incorrecto. Cualquier dato adicional que NO esté en el esquema se eliminará silenciosamente, causando la máxima pérdida de cabello y violando POLA.
Si agrega propiedades que no son parte del modelo, desde mongoose doc :
La opción estricta (habilitada de forma predeterminada) garantiza que los valores pasados a nuestro constructor de modelos que no se especificaron en nuestro esquema no se guarden en la base de datos.
Funciona así incluso con strict:throw , por lo que no tiene que preocuparse por los campos adicionales a los que no se hace referencia en el modelo.
Con respecto a la excepción no activada, Aaron Heckmann habla de esto en esta publicación con respecto a una excepción que no se activa en un save con strict : throw :
Esto es más un malentendido de cómo funciona la mangosta. la opción 'estricta' permite la validación de claves/valores que intentan almacenarse en la base de datos. los esquemas crean getters/setters en instancias de documentos que se delegan a los métodos
doc.{g,s}et()que están validados. adjuntar datos adhoc a una instancia de documento de mangosta no activaget/set()y, como tal, no garantiza la validación, ya que no hay forma de que ese día se guarde en la base de datos.
Como los campos adicionales no forman parte del modelo, no activan esas validaciones, por lo que no se activa ninguna excepción (y, por supuesto, esos campos no se guardan en la base de datos)
Se lanzarán excepciones solo si sus campos que pertenecen al modelo fallan esta validación