Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Hashing de contraseñas en MongoDB

8/22
Recursos

Aportes 5

Preguntas 1

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

Otra forma para eliminar el password de la respuesta pueden instalar el paquete:
npm i nestjs-mongoose-exclude luego en su Entity utilizar el decorador @ExcludeProperty() y por último utilizar un Interceptor a nivel de ruta o del controlador completo
quedaría así:

@Prop({ required: true })
  @ExcludeProperty()
  password: string;
@UseInterceptors(
  new SanitizeMongooseModelInterceptor({
    excludeMongooseId: false,
    excludeMongooseV: true,
  }),
)
@Controller('users')

Si quieres loguear a sus usuarios y no quieres devolver el password a la respuesta podrian hacer la busqueda asi

 const userToFind = await this.userModel.findOne({ email : user.email }).select("-password")

Eso les devolvera todo el objeto del usuario menos el password

Hola 👋
Yo implementaria algo mas reutilizable y que no toca al users.services.
Estando en el user.entity agregaria una funcion al metodo con el metodo pre de UserSchema y sobreescribiria el metodo toJSON del UserScham.

// user.entity.ts

...
UserSchema.pre('save', async function (next: HookNextFunction) {
  const user = this as User;

  // only hash the password if it has been modified (or is new)
  if (!user.isModified('password')) return next();

  // Random additional data
  const salt = await bcrypt.genSalt(10);

  const hash = await bcrypt.hash(user.password, salt);

  // Replace the password with the hash
  user.password = hash;

  return next();
});

Hasheara el password en la creacion y en la modificacion de la misma.

// usersentity.ts
....

UserSchema.methods.toJSON = function () {
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
  const { __v, password, ...user } = this.toObject();

  return user;
};

Sobreescribira un poco el metodo toJSON para que ignore el password y en este caso el __v al imprimir el usuario en cualquier tipo de retorno del mismo, esto lo hace super reutilizable y no tendremos que tocar nunca mas la config.

Y nuestro users.service esta intacto

 async create(payload: CreateUserDto) {
    const newUser = new this.userModel(payload);

    return await newUser.save();
  }

Espero haberles aportado algo 🚀

Una alternativa para devolver el objeto sin la contraseña podría ser usar la Keyword Delete de JS

delete model.password
npm i bcrypt
npm i -D @types/bcrypt