Паника: ошибка во время выполнения: недопустимый адрес памяти или разыменование нулевого указателя только в GAE

# #go #google-app-engine #go-gin

#Вперед #google-app-engine #go-gin

Вопрос:

Я работаю над приложением golang с использованием gin framework. По сути, он просто извлекает данные из firestore в виде JSON.

Локально это работает отлично, но когда я развертываю его в GAE (развертывание приложения gcloud), во время развертывания ошибки нет, но при доступе к странице он не работает, и в журналах отображается ошибка: «паника: ошибка времени выполнения: неверный адрес памяти или разыменование нулевого указателя».

список пакетов

 import (
    "fmt"
    "log"
    "net/http"

    "cloud.google.com/go/firestore"
    "github.com/gin-gonic/gin"
    "google.golang.org/api/iterator"
    "google.golang.org/appengine"
)

func main() {

}

//GetListCollections function

func GetListCollections(c *gin.Context) {

    var coll []string
    ctx := appengine.NewContext(c.Request)

    projectID := "XXX"
    client, err := firestore.NewClient(ctx, projectID)
    if err != nil {
        log.Fatalf("Failed to create client: %v", err)
    }
    defer client.Close()

    iter := client.Collection("collection").Documents(ctx)

    for {

        doc, err := iter.Next()

        if err == iterator.Done {
            break
        }
        if err != nil {
            fmt.Println("ERROR")
        }

        coll = append(coll, doc.Data()["Title"].(string))

    }

    c.JSON(http.StatusOK, gin.H{
        "collections": coll,
    })

}
  

Комментарии:

1.Вы должны по крайней мере указать, в какой строке ваш код завершается ошибкой.

2. Вы не обрабатываете ошибку, возвращенную iter.Next. Вы только печатаете его, а затем продолжаете, как будто ничего не произошло.

Ответ №1:

Поскольку никто не имеет ни малейшего представления, где это произошло?

Анализируя ваш код, единственная возможность, о которой я могу подумать, заключается в том, что ваша itr переменная пуста.

Возможно, вам потребуется изменить часть проверки на ошибку и добавить панику вместо того, чтобы просто печатать ошибку и продолжать выполнение

         if err != nil {
            panic("ERROR")
        }
  

Комментарии:

1. Проблема именно в if err != nil { panic(«ОШИБКА») }, но она работает локально, а не при развертывании в GAE

2. Теперь у меня ошибка в GAE: panic: ошибка rpc: code = permissiondened desc = Отсутствуют или недостаточны разрешения