Golang - GraphQL - Logged in User

Introduction

在这个最后要完善 User Login 的功能
完整的程式码放在这边可以做参考,如果真的改到一半不知道怎么改的话
因为原本的教学大概有点年代,直接複製是没办法用的XD
https://github.com/whitefloor/Go-GraphQL

到这一篇就是全部程式码都写完了,不过还要找时间看一些进阶资料

Sample Code

schema.resolvers.go 加强 CreateLink 错误处理以及新增回传

func (r *mutationResolver) CreateLink(ctx context.Context, input model.NewLink) (*model.Link, error) {user := auth.ForContext(ctx)if user == nil {return &model.Link{}, fmt.Errorf("access denied")}var link links.Linklink.User = userlinkID := link.Save()link.Title = input.Titlelink.Address = input.AddressgraphqlUser := &model.User{ID:   user.ID,Name: user.Username,}return &model.Link{ID: strconv.FormatInt(linkID, 10), Title: link.Title, Address: link.Address, User: graphqlUser}, nil}

schema.resolvers.go 从 Database 取得 User 资料

func (r *queryResolver) Links(ctx context.Context) ([]*model.Link, error) {var resultLinks []*model.LinkdbLinks := links.GetAll()for _, link := range dbLinks {graphqlUser := &model.User{ID:   link.User.ID,Name: link.User.Username,}resultLinks = append(resultLinks, &model.Link{ID: link.ID, Title: link.Title, Address: link.Address, User: graphqlUser})}return resultLinks, nil}

internal/links/links.go Save method 改写 Query

func (link Link) Save() int64 {//#3stmt, err := mig.Db.Prepare("INSERT INTO Links(Title,Address, UserID) VALUES(?,?, ?)")if err != nil {log.Fatal(err)}//#4res, err := stmt.Exec(link.Title, link.Address, link.User.ID)if err != nil {log.Fatal(err)}//#5id, err := res.LastInsertId()if err != nil {log.Fatal("Error:", err.Error())}log.Print("Row inserted!")return id}

internal/links/links.go 改写 GetAll funciton

func GetAll() []Link {stmt, err := mig.Db.Prepare("select L.id, L.title, L.address, L.UserID, U.Username from Links L inner join Users U on L.UserID = U.ID") // changedif err != nil {log.Fatal(err)}defer stmt.Close()rows, err := stmt.Query()if err != nil {log.Fatal(err)}defer rows.Close()var links []Linkvar username stringvar id stringfor rows.Next() {var link Linkerr := rows.Scan(&link.ID, &link.Title, &link.Address, &id, &username) // changedif err != nil {log.Fatal(err)}link.User = &users.User{ID:       id,Username: username,} // changedlinks = append(links, link)}if err = rows.Err(); err != nil {log.Fatal(err)}return links}

测试

到这边我们全部的程式码已经全部撰写完成了
$ go run server.go 打开 http://localhost:8080/
先使用以下 Query,会收到 access denied

mutation {  createLink(input: {title: "real link!", address: "www.graphql.org"}){    user{      name    }  }}

接着使用 Login 或是 CreateUser 拿到新 Token 后
在网页下方有可以新增 HTTP Header 的地方,新增 Token 后即可成功 CreateLink

{  "Authorization": "" // use your own generated token}

http://img2.58codes.com/2024/201188789npLnbzkoX.png

Reference

https://www.howtographql.com/graphql-go/8-logged-in-user-object/
https://relay.dev/docs/guides/graphql-server-specification/
https://graphql.org/learn/


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章