【问题标题】:deploy go api does not send any responsedeploy go api 不发送任何响应
【发布时间】:2018-09-21 17:19:30
【问题描述】:

我创建了一个 Go API 并进行了部署,但是当我看到日志时没有 Println 并且没有响应发送到客户端

main:

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

func handler(w http.ResponseWriter, r *http.Request) {
    if r.Method != "GET" {
        http.Error(w, "not allowed", http.StatusMethodNotAllowed)
        return
    }
    ...
}

yaml 文件:

runtime: go
api_version: go1.8
handlers:
- url: /.*
  script: _go_app

我正在访问的网址: myapp.appspot.com/v1/param

(这是什么_go_app?)

问题是,如果我通过“POST”请求,错误就可以正常工作,但如果我发出有效请求,则响应将永远存在。

完整代码:https://goplay.space/#yiIp42FKzzj

【问题讨论】:

  • ... 中的代码是否发送响应? Printlns 在哪里?
  • @ThunderCat 我已经包含了一个完整代码的链接
  • 使用记录器写入日志:godoc.org/google.golang.org/appengine/log。在本地运行时会挂起吗?如果是这样,向进程发送 SIGQUIT 以转储堆栈跟踪。这是我对这个问题的看法。

标签: google-app-engine go


【解决方案1】:

在 AppEngine 中,您必须使用 AppEngine logger,从请求中传递上下文。

来自 godoc 的示例:

c := appengine.NewContext(r)
query := &log.Query{
    AppLogs:  true,
    Versions: []string{"1"},
}

for results := query.Run(c); ; {
    record, err := results.Next()
    if err == log.Done {
        log.Infof(c, "Done processing results")
        break
    }
    if err != nil {
        log.Errorf(c, "Failed to retrieve next log: %v", err)
        break
    }
    log.Infof(c, "Saw record %v", record)
}

【讨论】:

  • 对不起,我不明白,我认为您的回答与问题无关;问题是,如果我通过“POST”请求,错误就可以正常工作,但如果我发出有效请求,响应将永远持续
  • 啊,我以为你的问题是关于缺少 Println 出现。
  • 您可以将函数的其余代码粘贴到您的问题中吗?我没有点击那个链接,对不起!
  • 不,老兄,对不起,代码太长了。该链接是 play.golang.org 的更好版本,不用担心
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-20
  • 2015-10-21
相关资源
最近更新 更多