es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Puedo lanzar un error cuando el cliente solicite un campo no seleccionado en la entidad?

En mi entidad de usuario, establecí la propiedad ‘password’ con opciones {select: false} (para evitar que el cliente acceda a sus contraseñas).

@InputType({ isAbstract: true })
@ObjectType()
@Entity('User')
export class User {

@Column({ unique: true })
@Field(() => String)
@IsEmail()
email: string;

@Column({ select: false })
@Field(() => String)
@IsString()
password: string;
}

Y en mi solucionador y servicio, creé una función findUser para encontrar un usuario en la base de datos con el correo electrónico.

// en solucionadores
  @Query(() => UserOutput)
  async findUser(@Args('email') email: string): Promise<useroutput> {
    return this.userService.findUser(email);
  }

// en servicio
// userDB es tipo cosas typeorm que se conectan a la tabla User en la base de datos PostgreSQL.
  async findUser(email: string): Promise<useroutput> {
    try {
      const user = await this.userDB.findOne(email);
      return user ? { success: true, user } : { success: false, error: 'Usuario no encontrado' };
    } catch (error) {
      return { success: false, error: 'Error inesperado de findUser' };
    }
  }

// DTO de salida de usuario
@ObjectType()
export class UserOutput {
  @Field(() => Boolean)
  @IsBoolean()
  success: boolean;

  @Field(() => String, { nullable: true })
  error?: string;

  @IsOptional()
  @Field(() => User, { nullable: true, defaultValue: null })
  user?: User;
}

Al acceder al GraphQL Playground e ingresar el comando findUser como se muestra a continuación (que contiene la propiedad ‘password’ que es el campo select: false):

consulta {
  findUser(email: "test@email.com") {
    exito
    error
    usuario {
      correo electrónico
      contraseña
    }
  }
}

Obtengo un objeto de errores y datos de la siguiente manera:

{
  "errores": [
    {
      "mensaje": "No se puede devolver nulo para el campo no nulo User.password.",
      "ubicaciones": [...],
      "camino": [...],
      "extensiones": {
        "código": "ERROR INTERNO DEL SERVIDOR",
        "excepción": {
          "stacktrace": [...]
        }
      }
    }
  ],
  "datos": {
    "findUser": {
      "éxito": verdadero,
      "error": nulo,
      "usuario": nulo
    }
  }
}

Esto es incorrecto porque se ha dado el correo electrónico correcto y se ha encontrado al usuario sin embargo {success: true} es incorrecto porque el objeto de usuario no se pudo recuperar usando el comando findUser con la contraseña que es un campo no seleccionado.

¿Cómo puedo devolver {success: false, error: “mensaje_de_error”, usuario: nulo} cuando el cliente solicita un campo no seleccionado como ‘contraseña’?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para devolver {success: false, error: "something_error_message", user: null} cuando el cliente solicita un campo no seleccionado como password, puede modificar la función findUser en el servicio de la siguiente manera:

    async findUser(email: string): Promise<userouput> {
      try {
        const user = await this.userDB.findOne(email, { select: ['email'] }); // solo selecciona el campo email
        if (!user) {
          return { sucess: false, error: 'Usuario no encontrado' };
        }
        return { sucess: true, user };
      } catch (error) {
        return { sucess: false, error: 'Error inesperado en la función findUser' };
      }
    }
    

    Al pasar { select: ['email'] } como segundo parámetro al método findOne, solo seleccionamos el campo email y excluimos el campo password. Si no se encuentra al usuario, devolvemos { sucess: false, error: 'Usuario no encontrado' }. Si se encuentra al usuario, devolvemos { sucess: true, user }.

    De esta manera, cuando el cliente solicite el campo password en la query findUser, recibirá una respuesta de {success: false, error: "Usuario no encontrado"} en lugar de un error del servidor. Tenga en cuenta que esta solución asume que el campo email está siempre seleccionado. Si desea asegurarse de que el campo email siempre esté seleccionado, puede agregar { select: ['email'] } como opción de selección predeterminada para la entidad User utilizando @Entity({ select: ['email'] }).

Comments are closed.