Versión de bcryptjs: "bcryptjs": "^2.4.3"
versión mangosta: "mongoose": "^6.0.12"
Estoy tratando de cifrar la contraseña del usuario en la creación del usuario o la actualización de la contraseña. Cuando creo un solo usuario con User.create() todo funciona según lo previsto (la contraseña está cifrada). Cuando uso User.insertMany() , los datos se insertan correctamente pero la contraseña no está cifrada. Este es mi esquema:
const userSchema = mongoose.Schema( { name: { type: String, required: true }, surname: { type: String, required: true }, voterId: { type: String, required: true, unique: true }, password: { type: String, required: true, unique: true, }, votedFor: [ { type: mongoose.Schema.ObjectId, ref: 'Election' } ], finishedVoting: { type: Boolean, required: true, default: false }, isAdmin: { type: Boolean, required: true, default: false, }, }, { timestamps: true, } ) userSchema.pre('save', async function(next) { // Only run this function if password was actually modified if (!this.isModified('password')) return next(); // Hash the password with salt 10 this.password = await bcrypt.hash(this.password, 10); next(); });Estos son algunos datos de muestra que estoy tratando de insertar:
const voters = [ { name: "Sherali", surname: "Samandarov", voterId: "194199", password: "FA654644", //will be encrypted isAdmin: false, finishedVoting: false // votedFor: [Object], // }, { name: "Sherali", surname: "Samandarov", voterId: "184183", password: "MB454644", //will be encrypted isAdmin: false, finishedVoting: false // votedFor: [Object], // }, { name: "Sherali", surname: "Samandarov", voterId: "194324", password: "FA651684", //will be encrypted isAdmin: false, finishedVoting: false // votedFor: [Object], // } ] Supongo que userSchema.pre('save', ...) no se activa en insertMany() por alguna razón
Resuelto.
Pude resolver el problema siguiendo la respuesta de @victorkt :
Utilice
pre('validate')en lugar depre('save')para establecer el valor del campo requerido. Mongoose valida los documentos antes de guardarlos, por lo que no se llamará a su middleware de guardado si hay errores de validación. Cambiar el middleware desaveavalidatehará que su función establezca el campo de contraseña antes de que se valide.
Asi que,
userSchema.pre('validate', async function(next) { // Only run this function if password was actually modified if (!this.isModified('password')) return next(); // Hash the password with salt 10 this.password = await bcrypt.hash(this.password, 10); next(); });