Хеш base64 моего идентификатора узла - это не то, что я ожидал
Я использую graphql-go
библиотека вместе с graphql-go/relay
. Я пытаюсь написать несколько базовых тестов для своего API, и у меня возникли проблемы с механизмом кодирования base64. Когда я выполняю простой запрос для идентификатора средства просмотра, кодированный идентификатор средства просмотра неверен.
Я жестко кодирую вызов db для получения первого пользователя с идентификатором 1
:
func TestGetViewer(t *testing.T) {
// Empty and fill the db for consistency
prepDb()
query := `
query {
viewer {
id
}
}
`
// The schema contains a viewer entry point that returns a userType:
// userType = graphql.NewObject(graphql.ObjectConfig{
// Name: "User",
// Description: "A user",
// Fields: graphql.Fields{
// "id": relay.GlobalIDField("User", nil),
// },
// })
schema := gql.NewSchema(db)
// graphql.Do is called by graphql.Execute. I'm trying to get
// closer to what is actually called in order to debug
result := graphql.Do(graphql.Params{
Schema: schema,
RequestString: query,
})
// The return data from our query
data := result.Data.(map[string]interface{})
// The relay.GlobalIDField in our schema should be calling this method
// under the hood, however, as you'll see it returns something different
id := relay.ToGlobalID("User", "1")
// prints map[viewer:map[id:VXNlcjo= username:janedoe]]
// notice the last character of the id
fmt.Println(data)
// prints VXNlcjox
fmt.Println(id)
Graphql.Do возвращает что-то действительно близкое, но последний символ закодированного идентификатора отличается от того, что возвращает relay.ToGlobalID
. Вместо этого он показывает последний символ, дополненный=
. И когда я пытаюсь бежатьrelay.FromGlobalID("VXNlcjo=")
, он может понять, что его type
является User
, но возвращает пустую строку для ID
. А если я заменю=
с x
, он возвращает правильный объект.
Я новичок в Go и этих концепциях, поэтому будем благодарны за любые идеи или помощь!
1 ответ
Я старый болван и забыл написать теги полей json при определении моих User
struct для получения данных из базы данных. Использование одной заглавной буквы - это нормально, но поскольку я использую заглавные буквы как I, так и D, она не разрешалась должным образом и передавала пустую строку дляid
. Ниже исправлено:
type User struct {
ID int `json:"id"`
}
Ошибка новичка! Но, возможно, это может быть полезно другим.