【发布时间】:2019-11-19 14:40:12
【问题描述】:
我正在尝试按照 Prisma's 指南设置 GraphQL Go 服务器。
Resolver.go
package main
import (
"context"
"prismago/hello-world/generated/prisma-client"
)
// Resolver struct
type Resolver struct {
Prisma *prisma.Client
}
// Mutation MutationResolver
func (r *Resolver) Mutation() MutationResolver {
return &mutationResolver{r}
}
// Post PostResolver
func (r *Resolver) Post() PostResolver {
return &postResolver{r}
}
// Query QueryResolver
func (r *Resolver) Query() QueryResolver {
return &queryResolver{r}
}
// User UserResolver
func (r *Resolver) User() UserResolver {
return &userResolver{r}
}
type mutationResolver struct{ *Resolver }
func (r *mutationResolver) CreateUser(ctx context.Context, name string) (*prisma.User, error) {
return r.Prisma.CreateUser(prisma.UserCreateInput{
Name: name,
}).Exec(ctx)
}
func (r *mutationResolver) CreateDraft(ctx context.Context, title string, userID string) (*prisma.Post, error) {
return r.Prisma.CreatePost(prisma.PostCreateInput{
Title: title,
Author: &prisma.UserCreateOneWithoutPostsInput{
Connect: &prisma.UserWhereUniqueInput{ID: &userID},
},
}).Exec(ctx)
}
func (r *mutationResolver) Publish(ctx context.Context, postID string) (*prisma.Post, error) {
published := true
return r.Prisma.UpdatePost(prisma.PostUpdateParams{
Where: prisma.PostWhereUniqueInput{ID: &postID},
Data: prisma.PostUpdateInput{Published: &published},
}).Exec(ctx)
}
type postResolver struct{ *Resolver }
func (r *postResolver) Author(ctx context.Context, obj *prisma.Post) (*prisma.User, error) {
return r.Prisma.Post(prisma.PostWhereUniqueInput{ID: &obj.ID}).Author().Exec(ctx)
}
type queryResolver struct{ *Resolver }
func (r *queryResolver) PublishedPosts(ctx context.Context) ([]prisma.Post, error) {
published := true
return r.Prisma.Posts(&prisma.PostsParams{
Where: &prisma.PostWhereInput{Published: &published},
}).Exec(ctx)
}
func (r *queryResolver) Post(ctx context.Context, postID string) (*prisma.Post, error) {
return r.Prisma.Post(prisma.PostWhereUniqueInput{ID: &postID}).Exec(ctx)
}
func (r *queryResolver) PostsByUser(ctx context.Context, userID string) ([]prisma.Post, error) {
return r.Prisma.Posts(&prisma.PostsParams{
Where: &prisma.PostWhereInput{
Author: &prisma.UserWhereInput{
ID: &userID,
}},
}).Exec(ctx)
}
func (r *queryResolver) Users(ctx context.Context) ([]prisma.User, error) {
return r.Prisma.Users(&prisma.UsersParams{
Where: &prisma.UserWhereInput{},
}).Exec(ctx)
}
type userResolver struct{ *Resolver }
func (r *userResolver) Posts(ctx context.Context, obj *prisma.User) ([]prisma.Post, error) {
return r.Prisma.User(prisma.UserWhereUniqueInput{ID: &obj.ID}).Posts(nil).Exec(ctx)
}
运行go run ./server 会产生以下错误:
cannot use &userResolver literal (type *userResolver) as type UserResolver in return argument:
*userResolver does not implement UserResolver (wrong type for Posts method)
have Posts(context.Context, *"prismago/hello-world/generated/prisma-client".User) ([]"prismago/hello-world/generated/prisma-client".Post, error)
want Posts(context.Context, *"prismago/hello-world/generated/prisma-client".User) ([]*"prismago/hello-world/generated/prisma-client".Post, error)
我尝试修复类型错误:
func (r *userResolver) Posts(ctx context.Context, obj *prisma.User) ([]*prisma.Post, error) {
return r.Prisma.User(prisma.UserWhereUniqueInput{ID: &obj.ID}).Posts(nil).Exec(ctx)
}
错误:
cannot use []"prismago/hello-world/generated/prisma-client".Post as type []*"prismago/hello-world/generated/prisma-client".Post in return argument
我做错了什么?
【问题讨论】:
-
这个错误基本上是说
[]prisma.Post不是[]*prisma.Post,这当然是正确的,这两个确实是不同的类型,并且要满足接口你的方法必须匹配逐字我>。除了错误信息还有什么不清楚的地方吗? -
感谢您的回复。因为我没有围棋经验,所以我可能会在这里跳枪。我理解打字错误,但我似乎无法通过简单地添加“*”等天真的尝试来纠正它。
-
这正是您修复它的方法,只需在需要的位置添加
*,至少这就是您修复那个特定错误的方法。如果编译仍然失败,则意味着您遇到的不仅仅是那个问题。请使用固定代码和新的错误消息更新您的问题。 -
显然
r.Prisma.User(prisma.UserWhereUniqueInput{ID: &obj.ID}).Posts(nil).Exec(ctx)返回[]Post而不是[]*Post。如果这是生成的代码,那么也许您应该进一步查看文档(您可能可以做一些事情来使 Prisma 与自身“兼容”)。 -
@Carrein 错误表明,正如 minitauros 指出的那样,从
Exec返回的类型是[]Post... 在这种情况下,而不是“在需要的地方添加*”您可以“删除不应该出现的*”,即无需更改*userResolver类型上Posts方法的返回类型,而是可以更改@987654341 上Posts方法的返回类型@接口从[]*Post到[]Post。