Сервис Cloud Run выдает ошибку 404 при попытке доступа с размещенного сайта - PullRequest
2 голосов
/ 20 июня 2020

Я создал сайт с использованием хостинга firebase, на котором я хотел бы отправлять запросы к API для отправки электронных писем. Локально это работает отлично. Однако после запуска API с помощью Google Cloud run у меня возникли ошибки при попытке доступа к API в Интернете с помощью размещенного сайта. Я использовал следующий учебник по Firebase, чтобы попытаться это настроить. https://firebase.google.com/docs/hosting/cloud-run#node .js_1

Мне удалось развернуть его без проблем, однако, когда я пытаюсь получить доступ к API через запросы POST, он возвращает ошибку 404. Сам сайт был разработан с использованием React. JS, а внутренний API был разработан с использованием Golang.

firebase. json:

    {
"hosting": {
    "public": "build",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ],
    "rewrites": [
      {
        "source": "**",
        "run": {
          "serviceId": "api",
          "region": "europe-west1"
        }
      }
    ]
  }
}

JavaScript где вызов API создается:

const response = await fetch(this.state.endpoint+"/sendEmail", {
                method: "POST",
                body: JSON.stringify(data),
                headers: {
                    'Content-Type': 'application/json'
                },
            });

Golang маршрутизатор, на котором обрабатывается маршрутизация:

router := mux.NewRouter().StrictSlash(true)
    router.HandleFunc("/sendEmail", SendEmail)

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

Опять же, при локальном запуске проблем нет, но запуск его в облаке возвращается ошибка 404.

Обновление

Теперь я исправил проблему, на которую указал @guillaumeblaquiere, это была проблема с самим кодом. Я не звонил на роутер, поэтому маршрутизация не происходила. Ниже приведена фиксированная версия

log.Print("api: starting server")

router := mux.NewRouter().StrictSlash(true)
router.HandleFunc("/sendEmail", SendEmail)

port := os.Getenv("PORT")
fmt.Println(port)
if port == "" {
    port = "8080"
}

log.Printf("api: listening on port %s", port)
log.Fatal(http.ListenAndServe(fmt.Sprintf(":%s", port), router))

Единственная оставшаяся проблема заключается в том, что мне нужно вызывать API напрямую, используя URL-адрес, а не перезаписывать.

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