GAE Go "Запрос не выполнен, так как экземпляр не может быть успешно запущен" - PullRequest
0 голосов
/ 20 октября 2019

Я уже некоторое время занимаюсь разработкой с Google App Engine Go, но уже год не трогал. Я попытался обновить свое приложение с «go1» (1.9?) До «go111», и в настоящее время я получаю некоторые странные ошибки без объяснения того, что происходит.

К ошибкам относятся:

  • The request failed because the instance could not start successfully
  • Container called exit(1).
  • 500 Internal server error
  • и т. Д.

Ничто из этого не указывает мне на какое-либоконкретная строка в моем коде, где что-то пойдет не так, и не объясните ничего более значимого ...

Я предполагаю, что ошибка связана с моим обновлением между версиями golang. Мне пришлось изменить пакет app на main, добавить в приложение функцию main, обновить пакет appengine до более новой версии, обновить приложение gsuite, добавить виджет облачной компиляции, изменить сценарий app.yamlот перехода к авто и т. д.

В общем, я потерян. Подобный вопрос SE не дал хороших ответов . Кто-то еще предположил, что app.yaml может быть виноват, поэтому вот мой:

runtime:     go111

handlers:
- url: /static
  static_dir: static
- url: /res
  static_dir: res
- url: /update
  script: auto
  secure: always
  login: admin
- url: /.*
  script: auto
  secure: always
  login: optional

Отладочный журнал консоли очень бесполезен:

А основной файл выглядит примерно так:

package main

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

var MainTemplate *template.Template

func main() {
    http.HandleFunc("/", hello)

    var err error
    MainTemplate, err = template.ParseFiles("html/main.html")
    if err != nil {
        log.Printf("ERROR! %v\n", err.Error())
        panic(err)
    }
    log.Printf("Hello world!\n")
}


func hello(w http.ResponseWriter, r *http.Request) {
    c := appengine.NewContext(r)
    //................................//
    MainTemplate.Execute(w, nil)
}

Что-нибудь еще может быть?

Ответы [ 2 ]

1 голос
/ 21 октября 2019

Хорошо, после некоторой помощи из нескольких комментариев, вот несколько проблем, которые мне пришлось исправить, чтобы заставить мой код работать:

  1. Я преобразовал свою init() функцию в main()без добавления способа прослушивания запросов. Код только что прошел через функцию main() и завершился без ошибок, поэтому проблемы с отладкой.
  2. appengine.NewContext(r), по-видимому, устарели, поэтому мне пришлось переключить эти операторы на r.Context(). MEANWHILE, Appengine Datastore по-прежнему использует golang.org/x/net/context, а не просто context, поэтому, если вы хотите использовать такие вещи, как RunInTransaction(), НЕ обновляйте свой импорт, context приводит к golang.org/x/net/context просто отлично
  3. Если вы будете следовать официальным примерам , предоставленным Google, вы, скорее всего, столкнетесь с ошибками типа textPayload: "2019/10/20 22:32:46 http: panic serving 127.0.0.1:16051: not an App Engine context. Вместо этого ваш код должен выглядеть следующим образом:
  4. Поскольку прежний пакет app теперь является пакетом main, убедитесь, что все файлы, на которые есть ссылки в app.yaml (favicon.ico дляпример) находятся в правильном положении по отношению к пакету main (мне пришлось переместить мой файл в другую папку, чтобы избежать появления ошибок при каждом запросе ...).
package main

import (
    "google.golang.org/appengine"
    "html/template"
    "net/http"
)

var MainTemplate *template.Template

func init() {
    http.HandleFunc("/", hello)
    MainTemplate, _= template.ParseFiles("html/main.html")
}

func main() {
    appengine.Main()
}

func hello(w http.ResponseWriter, r *http.Request) {
    c := r.Context()
    //................................//
    MainTemplate.Execute(w, nil)
}

Этодолжен работать. appengine.Main() очевидно связывает вас со всеми функциями appengine, необходимыми для использования контекста для хранилища данных / memcache / любых операций.

Спасибо комментаторам, которые помогли мне преодолеть первый горб!

0 голосов
/ 21 октября 2019

В вашем коде отсутствует часть для запуска слушателя. Добавьте это к своему коду:

    port := os.Getenv("PORT")
    if port == "" {
            port = "8080"
            log.Printf("Defaulting to port %s", port)
    }
    log.Fatal(http.ListenAndServe(fmt.Sprintf(":%s", port), nil))
...