gpt4 book ai didi

GoLang GraphQL 显示 EOF

转载 作者:数据小太阳 更新时间:2023-10-29 03:22:32 29 4
gpt4 key购买 nike

我试图制作一个使用 GraphQL 运行并与 PostgreSQL 连接的简单 GO 服务器,文件的编译和执行很顺利,与数据库的连接也很顺利,但是当我尝试检索所有用户时DB,我总是得到一个 EOF,查看我找到的答案

这个: Unexpected <EOF> while using graphql

但是这个答案并不适合我当前的项目。

这是所有要运行的文件。

DB.GO

package database

import (
"database/sql"
"fmt"
"log"

_ "github.com/lib/pq"
)

const (
host = "localhost"
port = 5432
user = "postgres"
password = "lacb2208"
dbname = "IMOX_Tech_Personal"
)

var database *sql.DB

func init() {
psqlInfo := fmt.Sprintf("host=%s port=%d user=%s "+
"password=%s dbname=%s sslmode=disable",
host, port, user, password, dbname)

var err error
database, err = sql.Open("postgres", psqlInfo)
if err != nil {
log.Fatal(err)
}
}

type User struct {
ID int32 `json:"id"`
UserName string `json:"username"`
}

// UserData is for params
type UserData struct {
UserName string
}

func AllUsers(wrapper func(user *User)) {
res, err := database.Query("SELECT id_user, username FROM public.users")
if err != nil {
log.Println("error fetching all users", err)
}
defer res.Close()
for res.Next() {
user := User{}
if err := res.Scan(&user.ID, &user.UserName); err != nil {
log.Fatal(err)
}
wrapper(&user)
}
}

RESOLVERS.GO

package resolvers

import (
"../database"
)

type Resolver struct{}

type UserResolver struct {
usr *database.User
}

// UserDataResolver is a struct for Resolver of the User params
type UserDataResolver struct {
userData *database.UserData
}

func (r *Resolver) AllUsers() *[]*UserResolver {
var users []*UserResolver
wrapper := func(user *database.User) {
users = append(users, &UserResolver{user})
}

database.AllUsers(wrapper)

return &users
}

func (userR *UserResolver) ID() int32 {
return userR.usr.ID
}

func (userR *UserResolver) UserName() string {
return userR.usr.UserName
}

MAIN.GO

package main

import (
"context"
"fmt"
"io/ioutil"
"log"
"net/http"
"os"

"github.com/gorilla/handlers"

"github.com/gorilla/mux"

"./resolvers"

"github.com/graph-gophers/graphql-go"
"github.com/graph-gophers/graphql-go/relay"
)

var (
schema *graphql.Schema
)

const (
schemaGraphQL = "schema.graphqls"
contentTypeKey = "Content-Type"
contentTypeJSONValue = "application/json"
authorizationTokenKey = "AuthorizationToken"
)

type (
Authorization struct {
Status string `json:"status"`
Message string `json:"message"`
AuthorizationToken string `json:"authorization_token`
}
)

func init() {
schemaFile, err := ioutil.ReadFile(schemaGraphQL)
if err != nil {
panic(err)
}
schema = graphql.MustParseSchema(string(schemaFile), &resolvers.Resolver{})
}

func main() {
router := mux.NewRouter()
router.HandleFunc("/", getToken)
router.Handle("/graphiql", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Write(page)
}))

router.Handle("/query", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
next := &relay.Handler{Schema: schema}
// authorization := r.Header.Get(authorizationKey)
// token := strings.Replace(authorization, "Bearer ", "", 1)
token := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6dHJ1ZSwiaGFzaGVkLXBhc3N3b3JkIjoiZmMzZDBjMDAxMTdmZjFjY2FlOWQzMTAzZTU3M2M5YzMiLCJpc3MiOiJsdWNob25ldHZ2In0.o8D2I3UwZzxDCmdLHQiQ4XLBFcADOiPKgeuq_-32Nmk"
ctx := context.WithValue(r.Context(), authorizationTokenKey, token)
next.ServeHTTP(w, r.WithContext(ctx))
}))

fmt.Println("server is running on port 8989")
server := http.ListenAndServe(":8989", handlers.LoggingHandler(os.Stdout, router))
log.Fatal(server)
}

func getToken(response http.ResponseWriter, request *http.Request) {
response.Header().Set(contentTypeKey, contentTypeJSONValue)
response.WriteHeader(200)
}

var page = []byte(`
<!DOCTYPE html>
<html>
<head>
<link href="https://cdnjs.cloudflare.com/ajax/libs/graphiql/0.11.11/graphiql.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/es6-promise/4.1.1/es6-promise.auto.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/fetch/2.0.3/fetch.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.2.0/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.2.0/umd/react-dom.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/graphiql/0.11.11/graphiql.min.js"></script>
</head>
<body style="width: 100%; height: 100%; margin: 0; overflow: hidden;">
<div id="graphiql" style="height: 100vh;">Loading...</div>
<script>
function graphQLFetcher(graphQLParams) {
return fetch("/query", {
method: "post",
body: JSON.stringify(graphQLParams),
credentials: "include",
}).then(function (response) {
return response.text();
}).then(function (responseBody) {
try {
return JSON.parse(responseBody);
} catch (error) {
return responseBody;
}
});
}
ReactDOM.render(
React.createElement(GraphiQL, {fetcher: graphQLFetcher}),
document.getElementById("graphiql")
);
</script>
</body>
</html>
`,
)

SCHEMA.GRAPHQL

schema {
query: Query
}

type User {
id: Int!
username: String!
}

input UserData {
id: Int!
userName: String!
}

type Query {
allUsers: [User]
}

type Mutation {
addUser(userData: UserData!): User
}

为什么不是来自数据库users 表:

CREATE TABLE public.users
(
id_user integer NOT NULL DEFAULT nextval('users_id_user_seq'::regclass),
username character varying(200) NOT NULL,
password character varying(300) NOT NULL,
hashed_password character varying(300) NOT NULL,
status boolean NOT NULL DEFAULT true,
CONSTRAINT users_pkey PRIMARY KEY (id_user),
CONSTRAINT users_username_key UNIQUE (username)
)
WITH (
OIDS=FALSE
);
ALTER TABLE public.users
OWNER TO postgres;

当我运行 localhost:8989/query 时,我从服务器得到的唯一答案是 EOF 但没有从数据库返回用户列表

谁能告诉我我的代码哪里做错了...

或者也许如何做一个好的查询:(

root@Crdzbird-Host:~/GoProjects/go-graphql-sample# curl -XPOST -d '{"query": "{ allUsers{} }"}' localhost:8989/query {"errors":[{"message":"Field \"allUsers\" of type \"[User]\" must have a selection of subfields. Did you mean \"allUsers { ... }\"?","locations":[{"line":1,"column":3}]}]}

最佳答案

一切都很好,我的问题是我想通过浏览器访问结果,但是当我在终端中输入时:

root@Crdzbird-Host:~/curl -X POST -H "Content-Type: application/json" -d '{"query": "{ allUsers {id,username} }"}' http://localhost:8989/query

我得到的值是:

{"data":{"allUsers":[{"id":1,"username":"Luis"},{"id":2,"username":"Jean"},{"id":3,"username":"Erich"},{"id":4,"username":"Marcos"},{"id":5,"username":"Alvin"},{"id":6,"username":"Jimmy"}]}}

我查询的方式不对,感谢大家的支持:)

关于GoLang GraphQL 显示 EOF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51227623/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com