#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 также в бэкэнде для запроса базы данных и проверки правильности пароля. затем вам нужно вернуть пароль. расшифруйте его с помощью секретной кодовой фразы или ключа, известного только серверной части. Так что это действительно зависит от случая использования. но в любом случае пароль должен быть зашифрован и в базе данных