[英]Type Graphql custom Resolver
Iam 有一個用戶 ObjectType,並希望在我的 LoginResolver 中,以 Object 的形式返回用戶和為該用戶生成的令牌,如下所示:
{user:User, token:string}
目前我可以返回用戶或字符串,這取決於我在 @Mutation() 裝飾器中給出的類型
@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;
}
當我嘗試創建一個 UserWIthToken 對象類型時,用戶實體上的每個字段都會出現以下錯誤:
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
您需要為這種情況創建一個自定義 ObjectType
@ObjectType()
class UserWithToken {
@Field(() => User)
user: User
@Field()
token: string
}
然后在查詢中使用 object 而不是用戶
@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
};
}
請注意,我在這里使用了@Query
而不是@Mutation
,因為它更適合這種情況,根據經驗,如果您想在不修改數據的情況下讀取數據,請使用 Query,否則刪除/添加/編輯數據使用 Mutation。
然后你可以像這樣運行登錄查詢
query {
login(email: "xx@xx.com", password: "xxxxx") {
token
user {
id
name
email
...
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.