Reputation: 41
Iam have a User ObjectType and want in my LoginResolver, to return the user and a generated token for that user as an Object like so:
{user:User, token:string}
Currently I can return either the User OR a string, depending on the Type i give in the @Mutation() decorator
@Mutation((returns) => User)
async login(
@Arg("email") email: string,
@Arg("password") password: string,
@Ctx("ctx") ctx: IContext
) {
const user = await this.userRepo.findOneUser({ where: { email } });
const success = await compare(password, user.password);
if (!success) ctx.throw(401);
const token = await this.tokenRepo.createToken(user);
return user;
}
when i try creating an UserWIthToken Objecttype I get the following Error for every field on the user entity:
app_1 | error: [ValidationError: Cannot query field "id" on type "UserWithToken".] {
app_1 | locations: [ [Object] ],
app_1 | path: undefined,
app_1 | extensions: { code: 'GRAPHQL_VALIDATION_FAILED', exception: [Object] }
app_1 | }
app_1 | }```
dont mind the app_1 here, Iam using docker
Upvotes: 0
Views: 1364
Reputation: 514
You need to create a custom ObjectType for this case
@ObjectType()
class UserWithToken {
@Field(() => User)
user: User
@Field()
token: string
}
Then use that object in your query instead of user
@Query((returns) => UserWithToken)
async login(
@Arg("email") email: string,
@Arg("password") password: string,
@Ctx("ctx") ctx: IContext
) : Promise<UserWithToken> {
const user = await this.userRepo.findOneUser({ where: { email } });
const success = await compare(password, user.password);
if (!success) ctx.throw(401);
const token = await this.tokenRepo.createToken(user);
return {
user,
token
};
}
Please note I used @Query
here instead of @Mutation
as it fit this case better, as a rule of thumb if you want to read data without modifying it, use Query, other wise for deleting/adding/editing data use Mutation.
Then you can run the login query like this
query {
login(email: "[email protected]", password: "xxxxx") {
token
user {
id
name
email
...
}
}
}
Upvotes: 3