Я создал сайт с использованием хостинга 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-адрес, а не перезаписывать.