Как обнаружить пустой результат с помощью Go Firebase-Admin SDK, когда данные по пути не существуют - PullRequest
0 голосов
/ 06 марта 2019

Я использую следующий код для получения объекта из базы данных Firebase в реальном времени.

type Item struct {
    title string `json:"title"`
}
var item Item
if err := db.NewRef("/items/itemid").Get(ctx, &item); err != nil {
    log.Infof(ctx, "An error occured %v", err.Error())
}
log.Infof(ctx, "Item %v", item)

Если в базе данных реального времени нет данных по указанному пути, SDK не вернет ошибку, вместо этого я получу пустую структуру в переменной item.

Каким будет самый понятный / читаемый способ обнаружить, что данных в пути нет?

Я искал несколько часов, но не смог найти однозначного ответа на этот вопрос.

1 Ответ

0 голосов
/ 08 марта 2019

Вот один из способов решения этой проблемы:

type NullableItem struct {
    Item struct {
        Title string `json:"title"`
    }
    IsNull bool
}

func (i *NullableItem) UnmarshalJSON(b []byte) error {
    if string(b) == "null" {
        i.IsNull = true
        return nil
    }

    return json.Unmarshal(b, &i.Item)
}

func TestGetNonExisting(t *testing.T) {
    var i NullableItem
    r := client.NewRef("items/non_existing")
    if err := r.Get(context.Background(), &i); err != nil {
        t.Fatal(err)
    }
    if !i.IsNull {
        t.Errorf("Get() = %v; want IsNull = true", i)
    }
}

В качестве рекомендации рекомендуется также реализовать функцию MarshalJSON().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...