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}
Reference
https://www.howtographql.com/graphql-go/8-logged-in-user-object/
https://relay.dev/docs/guides/graphql-server-specification/
https://graphql.org/learn/