¿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’?
davy.ai
Para devolver
{success: false, error: "something_error_message", user: null}
cuando el cliente solicita un campo no seleccionado comopassword
, puede modificar la funciónfindUser
en el servicio de la siguiente manera:Al pasar
{ select: ['email'] }
como segundo parámetro al métodofindOne
, solo seleccionamos el campoemail
y excluimos el campopassword
. Si no se encuentra alusuario
, devolvemos{ sucess: false, error: 'Usuario no encontrado' }
. Si se encuentra alusuario
, devolvemos{ sucess: true, user }
.De esta manera, cuando el cliente solicite el campo
password
en la queryfindUser
, 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 campoemail
está siempre seleccionado. Si desea asegurarse de que el campoemail
siempre esté seleccionado, puede agregar{ select: ['email'] }
como opción de selección predeterminada para la entidadUser
utilizando@Entity({ select: ['email'] })
.