如何在 google 云 运行 中为 firebase 创建上下文对象
how to create a context object in google cloud run for firebase
我正在尝试创建一个上下文对象,以便我可以从云连接到 firestore 运行,但是,我在网上找到的所有示例基本上都说我需要一个上下文对象,示例我网上找的一般是这样的:
ctx := context.Background()
client, err := firestore.NewClient(ctx, "projectID")
if err != nil {
fail(w, err.Error())
// TODO: Handle error.
}
您可以在如下位置找到这些示例:
https://godoc.org/cloud.google.com/go/firestore#example-NewClient
此示例中没有任何地方说明在哪里可以找到上下文对象。
所以我得到这个错误:
undefined: context
我认为文档太混乱了。
在 Go 中,您需要导入包。对于此语句 ctx := context.Background()
添加到源文件的顶部 import "context"
或与现有导入集合并。
与大多数语言一样,您拥有的经验越多,该语言就越有意义,您就会知道该怎么做。大多数语言都是一样的。在 C/C++ 中有 include
语句,C# 中有 using
语句,在 Python 中有 import
语句,等等
Google 有大量使用 Go 和 Google Cloud Platform 的示例:
我写了一篇文章,记录了我学习 Go 和 Google Cloud Platform 的 30 天旅程。
Google Cloud and Go – My Journey to Learn a new Language in 30 days
由于 3 行代码示例太多,初学者很难,而且网上缺乏完整的工作示例,像我一样,这里有一个完整的工作示例,这正是我开始这项任务时所需要的,我希望这对以后的任何人都有帮助。
package main
import (
"cloud.google.com/go/firestore" // https://godoc.org/cloud.google.com/go/firestore"
"context" // https://blog.golang.org/context
firebase "firebase.google.com/go"
"fmt"
"log"
"net/http"
"os"
)
func fail(w http.ResponseWriter, msg string) {
fmt.Fprintln(w, "fail:"+msg)
log.Println("fail:" + msg)
}
// State example code
type State struct {
Capital string `firestore:"capital"`
Population float64 `firestore:"pop"` // in millions
}
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
override := make(map[string]interface{})
ctx := context.Background()
client, err := firestore.NewClient(ctx, "YOURPID")// set GOOGLE_APPLICATION_CREDENTIALS env var
if err != nil {
fail(w, err.Error())
return
}
states := client.Collection("States")
ny := states.Doc("NewYork")
wr, err := ny.Create(ctx, State{
Capital: "Albany",
Population: 19.8,
})
fmt.Println(wr)
})
log.Fatal(http.ListenAndServe("0.0.0.0:8082", nil))
}
您应该在请求处理程序中使用 http.Request 对象的 r.Context()
而不是像 context.Background() 这样初始化新的分离上下文。
上下文的主要目的是传播它们,在云中 运行 你总是处理请求,所以如果你传递请求的上下文,这是正确的做法。
我认为在你的情况下,没有导入“context”包。确保在你的 Dockerfile 中使用 go 1.11+ 并说:
import “context”
我正在尝试创建一个上下文对象,以便我可以从云连接到 firestore 运行,但是,我在网上找到的所有示例基本上都说我需要一个上下文对象,示例我网上找的一般是这样的:
ctx := context.Background()
client, err := firestore.NewClient(ctx, "projectID")
if err != nil {
fail(w, err.Error())
// TODO: Handle error.
}
您可以在如下位置找到这些示例: https://godoc.org/cloud.google.com/go/firestore#example-NewClient 此示例中没有任何地方说明在哪里可以找到上下文对象。
所以我得到这个错误:
undefined: context
我认为文档太混乱了。
在 Go 中,您需要导入包。对于此语句 ctx := context.Background()
添加到源文件的顶部 import "context"
或与现有导入集合并。
与大多数语言一样,您拥有的经验越多,该语言就越有意义,您就会知道该怎么做。大多数语言都是一样的。在 C/C++ 中有 include
语句,C# 中有 using
语句,在 Python 中有 import
语句,等等
Google 有大量使用 Go 和 Google Cloud Platform 的示例:
我写了一篇文章,记录了我学习 Go 和 Google Cloud Platform 的 30 天旅程。
Google Cloud and Go – My Journey to Learn a new Language in 30 days
由于 3 行代码示例太多,初学者很难,而且网上缺乏完整的工作示例,像我一样,这里有一个完整的工作示例,这正是我开始这项任务时所需要的,我希望这对以后的任何人都有帮助。
package main
import (
"cloud.google.com/go/firestore" // https://godoc.org/cloud.google.com/go/firestore"
"context" // https://blog.golang.org/context
firebase "firebase.google.com/go"
"fmt"
"log"
"net/http"
"os"
)
func fail(w http.ResponseWriter, msg string) {
fmt.Fprintln(w, "fail:"+msg)
log.Println("fail:" + msg)
}
// State example code
type State struct {
Capital string `firestore:"capital"`
Population float64 `firestore:"pop"` // in millions
}
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
override := make(map[string]interface{})
ctx := context.Background()
client, err := firestore.NewClient(ctx, "YOURPID")// set GOOGLE_APPLICATION_CREDENTIALS env var
if err != nil {
fail(w, err.Error())
return
}
states := client.Collection("States")
ny := states.Doc("NewYork")
wr, err := ny.Create(ctx, State{
Capital: "Albany",
Population: 19.8,
})
fmt.Println(wr)
})
log.Fatal(http.ListenAndServe("0.0.0.0:8082", nil))
}
您应该在请求处理程序中使用 http.Request 对象的 r.Context()
而不是像 context.Background() 这样初始化新的分离上下文。
上下文的主要目的是传播它们,在云中 运行 你总是处理请求,所以如果你传递请求的上下文,这是正确的做法。
我认为在你的情况下,没有导入“context”包。确保在你的 Dockerfile 中使用 go 1.11+ 并说:
import “context”