Go App Engine Запись в зависания хранилища Google - PullRequest
0 голосов
/ 02 июня 2018

Я пишу простую программу App Engine, используя Go.Мне нужно записать некоторые данные в Google DataStore.Программа постоянно зависает, когда я пытаюсь. Поместить данные в хранилище.Это потрясло меня всю эту неделю.

В какой-то момент мне удалось записать данные в DataStore, что я понял только тогда, когда обнаружил, как просматривать загруженные данные в Cloud Console.С тех пор я сильно изменил код, и теперь я больше не могу писать какие-либо данные.Он зависает каждый раз.

Логи ничего полезного не показывают.Только уведомление о том, что время процесса истекло.Журналы не записываются из программы, только из системы.

Процесс прерван из-за превышения срока запроса.(Код ошибки 123)

Я пытался изменить операторы импорта, используя эту ссылку , но не удалось скомпилировать, поэтому я вернулся к этой ссылке который компилируется без проблем.

Я рассмотрел возможность того, что я каким-то образом неправильно настроил (возможно, изуродовал?) мою среду разработки, поэтому я пошел на чистую машину и тщательно прошел новую установку.Он все еще зависает.

Мой файл app.yaml:

runtime: go
    api_version: go1

handlers:
    - url: /.*
      script: _go_app

Файл index.yaml, который я добавил:

indexes:

    - kind: Bacon
        properties:
    - name: YCode
        direction: asc
    - name: URL
    - name: Owner
    - name: Location

Вот мой код:

package main

    import (
        "fmt"
        "log"
        "net/http"
        "google.golang.org/appengine/datastore"
        "google.golang.org/appengine" 
    )

     type Bacon struct {
        YCode string
        URL string
        Owner string
        Location string
    } 

    func main() {
        http.HandleFunc("/", indexHandler)
        appengine.Main() 
    }

    func indexHandler(w http.ResponseWriter, r *http.Request) {

        ctx := appengine.NewContext(r)
        projectID := "fake-for-discussion-thread-787987"

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

        kind := "Bacon"
        name := "3"
        baconKey := datastore.NameKey(kind, name, nil)

        //Make bacon
        bacon := Bacon{
            YCode: "1",
            URL: "http://www.safeway.com",
            Owner: "Bob",
            Location: "Deli",
        }

        // I've confirmed that this is where it hangs every time.  
        // It doesn't even capture my silly fatal log entry. 
        // It just times out and finally sends a 500 Server Error.
        if _, err := client.Put(ctx, baconKey, &bacon); err != nil {
            log.Fatalf("Failed to save my Bacon: %v", err)
        }

        client.Close()

    }

Большое спасибо за любую помощь, которую вы можете предложить!

1 Ответ

0 голосов
/ 02 июня 2018

Хорошо!Так что это действительно заставило меня взобраться на стену, но мне удалось взломать это сегодня утром.Мне было так трудно найти онлайн-документацию, что я хочу убедиться, что я вставил свой (теперь работающий) код, чтобы другие могли избавиться от боли.

Примечательно, что я начал подозревать, что документация / примеры Go могут указать неверный путь, если вы развертываете в App Engine.App Engine не нравятся некоторые из основных библиотек Go и т. Д. Это может сбить с толку при развертывании в App Engine.

Также обратите внимание, что я добавил много своих уроков в комментарии к моему первоначальному вопросу.Я делаю эту запись, чтобы я мог правильно разместить свой фиксированный код, специфичный для App Engine.

    //Modified to work on App Engine. May not work right locally, etc.

    package main

    import (
        "fmt"
        "log"
        "net/http"
        "google.golang.org/appengine/datastore"
        "google.golang.org/appengine" 
    )

     type Bacon struct {
        YCode string
        URL string
        Owner string
        Location string
    } 

    func main() {
        http.HandleFunc("/", indexHandler)
        appengine.Main() 
    }

    func indexHandler(w http.ResponseWriter, r *http.Request) {

        //This gives a context that makes App Engine happy      
        ctx := appengine.NewContext(r)

        //NOT NEEDED (Apparently, App Engine knows who you are. Creepy.)    
        //projectID := "fake-for-discussion-thread-787987" 

        //NOT NEEDED (And may actually cause you great woe!)
        //client, err := datastore.NewClient(ctx, projectID)
        //if err != nil {
        //  log.Fatalf("Failed to create client: %v", err)
        //  return
        //} 

        //Turns out that these aren't needed, either. 
        //kind := "Bacon"
        //name := "3"

        //Note the changes from my original code, including the
        //change from NameKey to NewIncompleteKey and the
        //hard-coding of Bacon in the arguments. Alternatively, you might
        //use a variable, depending on your needs. I just need bacon.
        //This causes the entity you create in Google DataStore 
        //to have a "Kind" of "Bacon"
        baconKey := datastore.NewIncompleteKey(ctx, "Bacon", nil)

        //Make bacon
        bacon := Bacon{
            YCode: "1",
            URL: "http://www.safeway.com",
            Owner: "Bob",
            Location: "Deli",
        }

        // Note changes here. No more client, just a call to datastore.Put.
        // Now it works!  One caveat: I'm still trying to figure out why it writes 
        // my data twice. But, hey!  At least it's writing!
        if _, err := datastore.Put(ctx, baconKey, &bacon); err != nil {
            log.Fatalf("Failed to save my Bacon: %v", err)
        }

        //No client, so no need to close.
        //client.Close()

    }

Cheers!

...