Я не совсем понимаю, как к этому подойти.
Похоже, что GAE хочет, чтобы каждая клиентская библиотека использовала контекст. Контекст ограничен областью http.Request.
Я ранееИмею опыт работы примерно так:
main.go
type server struct {
db *firestore.Client
}
func main() {
// Setup server
s := &server{db: NewFirestoreClient()}
// Setup Router
http.HandleFunc("/people", s.peopleHandler())
// Starts the server to receive requests
appengine.Main()
}
func (s *server) peopleHandler() http.HandlerFunc {
// pass context in this closure from main?
return func(w http.ResponseWriter, r *http.Request) {
ctx := r.Context() // appengine.NewContext(r) but should it inherit from background somehow?
s.person(ctx, 1)
// ...
}
}
func (s *server) person(ctx context.Context, id int) {
// what context should this be?
_, err := s.db.Client.Collection("people").Doc(uid).Set(ctx, p)
// handle client results
}
firebase.go
// Firestore returns a warapper for client
type Firestore struct {
Client *firestore.Client
}
// NewFirestoreClient returns a firestore struct client to use for firestore db access
func NewFirestoreClient() *Firestore {
ctx := context.Background()
client, err := firestore.NewClient(ctx, os.Getenv("GOOGLE_PROJECT_ID"))
if err != nil {
log.Fatal(err)
}
return &Firestore{
Client: client,
}
}
Это имеет большое значение для определения масштаба клиента проекта.Например, зависание от server{db: client}
и присоединение обработчиков к этой структуре или необходимость передавать его через внедрение зависимостей в запросе.
Я замечаю, что вызовы с использованием клиента требуют другого контекста.Так что, возможно, это должно выглядеть так:
main.go
создать ctx := context.Background()
main.go
передать это новому клиенту handler ctx := appengine.NewContext(r)
В основном начальная установка не имеет значения вне context.Background()
, потому что новые запросы имеют контекст, отличный от App Engine?
Я мог бы передать ctx в обработчик из main, а затем отключить NewContextоб этом + запрос?
Какой идиоматический подход к этому?
примечание: у меня были методы firestore из структуры Firestore
также в предыдущих итерациях ...