Могу ли я выдать ошибку, когда клиент запрашивает не выбранное поле на сущности

#typescript #graphql #nestjs #typeorm #dto

#машинописный текст #graphql #гнездышко #типорм #dto

Вопрос:

В моей сущности пользователя я установил свойство «пароль» с параметрами {select: false} (чтобы клиент не мог получить доступ к своим паролям).

 @InputType({ isAbstract: true }) @ObjectType() @Entity('User') export class User {   @Column({ unique: true })  @Field(() =gt; String)  @IsEmail()  email: string;   @Column({ select: false })  @Field(() =gt; String)  @IsString()  password: string; }  

И на моем распознавателе и сервисе я создал findUser функцию для findUser в базе данных с электронной почтой.

 //on resolvers  @Query(() =gt; UserOutput)  async findUser(@Args('email') email: string): Promiselt;UserOutputgt; {  return this.userService.findUser(email);  }  //on service: this.userService.findUser(email) on resolvers findUser function //userDB is typeorm things that connected to User table in postgres DB.  async findUser(email: string): Promiselt;UserOutputgt; {  try {  const user = await this.userDB.findOne(email);  return user ? { sucess: true, user } : {sucess: false, error: 'User not found'};  } catch (error) {  return { sucess: false, error: 'Unexpected error from findUser' };  }  }  //userOutput DTO @ObjectType() export class UserOuput {  @Field(() =gt; Boolean)  @IsBoolean()  sucess: boolean;   @Field(() =gt; String, { nullable: true })  error?: string;   @IsOptional()  @Field(() =gt; User, { nullable: true, defaultValue: null })  user?: User; }   

При доступе к игровой площадке GraphQL и вводе findUser команды следующим образом (которые содержат свойство «пароль», которое является полем {select: false}):

 query {  findUser(email: "test@email.com" ) {  sucess  error  user {  email  password  }  } }   

И я получаю объект ошибок и данные следующим образом:

 {  "errors": [  {  "message": "Cannot return null for non-nullable field User.password.",  "locations": [...],  "path": [...],  "extensions": {  "code": "INTERNAL_SERVER_ERROR",  "exception": {  "stacktrace": [...]  }  }  }  ],  "data": {  "findUser": {  "sucess": true,  "error": null,  "user": null  }  } }  

И этот код не является неправильным. потому что мы дали правильный адрес электронной почты и успешно нашли пользователя. Однако {success: true} это неверно, поскольку объект пользователя не удалось получить с помощью findUser команды с паролем, который не выбран-поле.

Как я могу вернуться {success: false, error: "something_error_message", user: null} , когда клиент запрашивает не выбранное поле, например «пароль»?

Комментарии:

1. проблема в том, что select:false является директивой typeorm, а не директивой type-graphq. Таким образом, в схеме это по-прежнему обязательно. Я бы либо удалил поле @в классе пользователя, либо сделал его недействительным, как в вашем dto.

2. @Джером прав. Более того, возможность для пользователя вернуть пароль является плохой практикой. Просто не показывайте это в схеме, и вы можете идти 🙂

3. @Jerome спасибо за ответ. я попробую это сделать.

4. @carlo вы правы, но это зависит от того, используете ли вы graphql также в бэкэнде для запроса базы данных и проверки правильности пароля. затем вам нужно вернуть пароль. расшифруйте его с помощью секретной кодовой фразы или ключа, известного только серверной части. Так что это действительно зависит от случая использования. но в любом случае пароль должен быть зашифрован и в базе данных