我有一个用Go编写并使用Go 1.11运行时部署的谷歌云函数,它可以工作。问题出现在将运行时升级到Go 1.13时,相同的功能和我得到的错误是:
Error: could not handle the request
在云功能的日志中,我有错误的详细信息:
Function execution started
open ./progress.html: no such file or directory
Function execution took 232 ms, finished with status: 'connection error'
文件就在那里,与Go文件位于同一文件夹中。
以下是功能的相关代码:
// Progress ... Entrypoint of our Cloud Function
func Progress(w http.ResponseWriter, r *http.Request) {
...
tpl, err := template.ParseFiles("progress.html")
if err != nil {
log.Fatalln(err)
}
buf := new(bytes.Buffer)
err = tpl.Execute(buf, data)
if err != nil {
log.Fatalln(err)
}
...
}
如果有帮助的话,这里是这个函数的存储库。
唯一改变的是用于部署它的Go运行时,从1.11到1.13。
以下是用于部署它的两个命令:
它起作用:
gcloud functions deploy progress --runtime go111 --entry-point Progress --trigger-http --memory 128MB
它不起作用(它成功部署,但使用该功能时出现错误(:
gcloud functions deploy progress --runtime go113 --entry-point Progress --trigger-http --memory 128MB
错误是假设使用不同运行时的Google Cloud函数实现相同,但在调试中,我发现了一些差异。
这里有一个调试它的测试函数:
func Progress(w http.ResponseWriter, r *http.Request) {
wd, _ := os.Getwd()
fmt.Fprintf(w, "$> pwdn%snn", wd)
bytes, _ = exec.Command("ls", "-l").CombinedOutput()
fmt.Fprintf(w, "$> ls -ln%snn", bytes)
}
以下是使用Go 1.11运行时的输出:
$> pwd
/srv/files/
$> ls -l
total 5
-rw-r--r-- 1 root root 1068 Aug 13 04:15 LICENSE
-rw-r--r-- 1 root root 1097 Aug 13 04:15 README.md
drwxr-xr-x 2 root root 0 Aug 13 04:15 colors-example
-rw-r--r-- 1 root root 2093 Aug 13 04:15 progress.go
-rw-r--r-- 1 root root 627 Aug 13 04:15 progress.html
正如您所看到的,所有文件都在当前目录中,包括丢失的文件progress.html
。
但以下是使用Go 1.13运行时的输出:
$> pwd
/srv
$> ls -l
total 0
drwxr-xr-x 2 www-data www-data 0 Jan 1 1980 pkg
drwxr-xr-x 2 www-data www-data 0 Jan 1 1980 src
注意我的文件已经不在了,所以我打印了src
的内容,并包含了一个名为progress
(我的项目名称(的文件夹。
在那个文件夹里,有我所有的文件。
因此,使用Go 1.13运行时的修复方法是:
// Progress ... Entrypoint of our Cloud Function
func Progress(w http.ResponseWriter, r *http.Request) {
...
tpl, err := template.ParseFiles("src/progress/progress.html")
if err != nil {
log.Fatalln(err)
}
buf := new(bytes.Buffer)
err = tpl.Execute(buf, data)
if err != nil {
log.Fatalln(err)
}
...
}
我希望它能帮助一些人,不仅是为了得到答案,而且如果新运行时的规则发生了变化,你就可以调试它并找到正确的文件位置。