【问题标题】:Google App Engine Golang returns 404 page not foundGoogle App Engine Golang 返回 404 页面未找到
【发布时间】:2018-01-06 00:20:49
【问题描述】:

app.yaml

runtime: go
api_version: go1

handlers:
- url: /.*
  script: _go_app

我的main.go 文件:

主包

import (
    "fmt"
    "github.com/cbll/stockmarket-service/lib"
    "net/http"
    "log"
    "google.golang.org/appengine"
)

func main() {
    appengine.Main()
    fmt.Println("Starting the application...")
    // Run application until halted
    for {
        go lib.GetStockData()
        StockController()
    }
}


// Expose controller at http://localhost:8080/
func StockController() {
    var port = ":8080"

    fmt.Println("Starting web server listening on port", port)

    http.HandleFunc("/", lib.StocksHandler)
    log.Fatal(http.ListenAndServe(port, nil))
}

如果我注释掉appengine.Main(),我可以在本地运行它而不会出现任何问题。它从端口8080 开始。

gcloud app deploy 可以正常工作,并将应用正确部署到谷歌云。

但是,将我带到该站点的gcloud app browse 返回404 page not found。事实上,使用gcloud app logs read 检查日志:

2018-01-06 00:04:18 default[20180106t010155]  + exec app
2018-01-06 00:08:32 default[20180106t010155]  "GET /" 404

我有点不确定在哪里进行故障排除。它在本地工作,它指定 :8080 作为它应该的端口(据我所知?),并导入 appengine 主要方法。我可能会错过什么?

编辑:

将处理程序更改为

- url: /

结果:

2018-01-06 00:17:30 default[20180106t010915]  "GET / HTTP/1.1" 404

.. 代替?

【问题讨论】:

  • 你的script: 在你的app.yaml 应该指向main.go
  • 但是 Google 的文档指出:For Go apps, script should always have a value of _go_app.? cloud.google.com/appengine/docs/standard/go/config/…
  • 我的错,刚刚再次检查。你说没有appengine.Main()在本地运行就好了,上传的时候也是这样吗?
  • 不,如果您在没有appengine.Main() 的情况下上传,则会收到错误:parser: found a top level package main with function main, but main does not call appengine.Main();
  • 您的应用引擎是否使用了柔性环境?在 appengine github 上,它声明它与该环境不兼容:github.com/golang/appengine

标签: google-app-engine nginx go


【解决方案1】:

标准环境提供主程序,运行http服务器。将初始化代码放入 init() 函数中。不要使用主包。

package app

import (
    "github.com/cbll/stockmarket-service/lib"
    "net/http"
)

func init() {
    go lib.GetStockData()
    http.HandleFunc("/", lib.StocksHandler)
}

【讨论】:

  • 它现在返回 JSON!虽然,它是空的。 lib.GetStockData() 没有运行?它没有记录它应该记录的内容。尽管 http 服务器现在响应 200,但它从未运行我的任何 fmt.Println 命令。奇怪?
  • 这个答案也适用于我在 App Engine 上部署我的应用程序 - GCP 中的标准。在使用这些脚本 4 天之后,这终于是可行的解决方案(并且是网络中唯一一个明显存在与 App Engine 相关的解决方案的地方)。非常感谢! +1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-04
  • 1970-01-01
  • 2020-04-17
  • 2012-12-14
  • 2013-09-09
相关资源
最近更新 更多