如何在 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 的示例:

Google Cloud Examples in Go

我写了一篇文章,记录了我学习 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”