2017-09-26 16 views
0

私はgolangとgoogleアプリケーションエンジンのデータストアを学習しています。データストアに保存できないgcloud

データストアからデータを保存および取得するための簡単な残りのAPI呼び出しを行う予定です。

私はいくつかのhello worldチュートリアルと公式スタートガイドを続けました。結局私が思いついたのはこれです。

`

package hello 

import (
     "fmt" 
     "log" 
     "net/http" 
     "encoding/json" 
     "cloud.google.com/go/datastore" 
     "golang.org/x/net/context" 
     "github.com/gorilla/mux" 
     "time" 
) 
type Task struct { 
     Description string `datastore:"description"` 
     Created time.Time `datastore:"created"` 
     id  int64 
} 
func saveData(w http.ResponseWriter, r *http.Request){ 
     fmt.Println("Endpoint Hit: saveData") 
     input := r.URL.Query().Get("input") 
     fmt.Println(input) 

     ctx := context.Background() 
     projectID := "api-project-426361742627" 
     client, err := datastore.NewClient(ctx, projectID) 
     if err != nil { 
       log.Fatalf("Failed to create client: %v", err) 
     } 
     kind := "Task" 
     task := Task{ 
       Description: input, 
       Created: time.Now(), 
     } 
     taskKey := datastore.IncompleteKey(kind, nil) 

     if _, err := client.Put(ctx, taskKey, &task); err != nil { 
       log.Fatalf("Failed to save task: %v", err) 
     } 

     fmt.Printf("Saved %v: %v\n", taskKey, task.Description) 
     json.NewEncoder(w).Encode(task) 
} 
func returnAll(w http.ResponseWriter, r *http.Request){ 
     fmt.Println("Endpoint Hit: returnAll") 

     ctx := context.Background() 
     projectID := "api-project-426361742627" 
     client, err := datastore.NewClient(ctx, projectID) 
     if err != nil { 
       log.Fatalf("Failed to create client: %v", err) 
     } 

     query := datastore.NewQuery("Task").Order("description") 

     var tasks []*Task 

     keys, err := client.GetAll(ctx, query, &tasks) 
     for i, key := range keys { 
       tasks[i].id = key.ID 
     } 
     // for _, t := range tasks { 
     //   // fmt.Println(t.id, t.Description) 
     // } 

     json.NewEncoder(w).Encode(tasks) 
} 

func homePage(w http.ResponseWriter, r *http.Request){ 
     fmt.Fprintf(w, "Welcome to the HomePage!") 
     fmt.Println("Endpoint Hit: homePage") 
} 
func handleRequests() { 
     myRouter := mux.NewRouter() 
     myRouter.HandleFunc("/", homePage) 
     myRouter.HandleFunc("/save", saveData) 
     myRouter.HandleFunc("/retrieve", returnAll) 
     http.Handle("/", myRouter) 
} 
func init() { 
     handleRequests() 
} 

`

今、私が直面しています問題は、私は次のエラーを取得しています。このラインで

client, err := datastore.NewClient(ctx, projectID)

です。

2017/09/26 07:15:16 http: panic serving 127.0.0.1:59488: not an App Engine context 
goroutine 17 [running]: 
net/http.(*conn).serve.func1(0xc82021e000) 
    /home/aditya/google-cloud-sdk/platform/google_appengine/goroot-1.6/src/net/http/server.go:1389 +0xc1 
panic(0xa44740, 0xc82018a8c0) 
    /home/aditya/google-cloud-sdk/platform/google_appengine/goroot-1.6/src/runtime/panic.go:443 +0x4e9 
google.golang.org/appengine/internal.fullyQualifiedAppID(0x7f4142e12be0, 0xc82000b4e0, 0x0, 0x0) 
    /home/aditya/work/src/google.golang.org/appengine/internal/identity_classic.go:54 +0x8b 
google.golang.org/appengine/internal.FullyQualifiedAppID(0x7f4142e12be0, 0xc82000b4e0, 0x0, 0x0) 
    /home/aditya/work/src/google.golang.org/appengine/internal/api_common.go:77 +0xe2 
google.golang.org/appengine/internal.AppID(0x7f4142e12be0, 0xc82000b4e0, 0x0, 0x0) 
    /home/aditya/work/src/google.golang.org/appengine/internal/identity.go:13 +0x37 
google.golang.org/appengine.AppID(0x7f4142e12be0, 0xc82000b4e0, 0x0, 0x0) 
    /home/aditya/work/src/google.golang.org/appengine/identity.go:20 +0x37 
golang.org/x/oauth2/google.FindDefaultCredentials(0x7f4142e12be0, 0xc82000b4e0, 0xc820222170, 0x1, 0x1, 0xc820222150, 0x0, 0x0) 
    /home/aditya/work/src/golang.org/x/oauth2/google/default.go:92 +0x5a8 
google.golang.org/api/internal.Creds(0x7f4142e12be0, 0xc82000b4e0, 0xc820248240, 0xc8202452c0, 0x0, 0x0) 
    /home/aditya/work/src/google.golang.org/api/internal/creds.go:37 +0x173 
google.golang.org/api/transport/grpc.Dial(0x7f4142e12be0, 0xc82000b4e0, 0xc820245638, 0x3, 0x3, 0x0, 0x0, 0x0) 
    /home/aditya/work/src/google.golang.org/api/transport/grpc/dial.go:47 +0x272 
cloud.google.com/go/datastore.NewClient(0x7f4142e12be0, 0xc82000b4e0, 0xc0c320, 0x18, 0x0, 0x0, 0x0, 0x9, 0x0, 0x0) 
    /home/aditya/work/src/cloud.google.com/go/datastore/datastore.go:87 +0x87f 
main76346.returnAll(0x7f4142dcb058, 0xc820234000, 0xc82022a000) 
    hello.go:51 +0x1b8 
net/http.HandlerFunc.ServeHTTP(0xcd13d8, 0x7f4142dcb058, 0xc820234000, 0xc82022a000) 
    /home/aditya/google-cloud-sdk/platform/google_appengine/goroot-1.6/src/net/http/server.go:1618 +0x3a 
github.com/gorilla/mux.(*Router).ServeHTTP(0xc820052660, 0x7f4142dcb058, 0xc820234000, 0xc82022a000) 
    /home/aditya/work/src/github.com/gorilla/mux/mux.go:133 +0x37c 
net/http.(*ServeMux).ServeHTTP(0xc82000eab0, 0x7f4142dcb058, 0xc820234000, 0xc82022a000) 
    /home/aditya/google-cloud-sdk/platform/google_appengine/goroot-1.6/src/net/http/server.go:1910 +0x17d 
appengine_internal.handleFilteredHTTP(0x7f4142dcb058, 0xc820234000, 0xc82022a000) 
    /home/aditya/google-cloud-sdk/platform/google_appengine/goroot-1.6/src/appengine_internal/api_dev.go:102 +0x409 
net/http.HandlerFunc.ServeHTTP(0xccfe48, 0x7f4142dcb058, 0xc820234000, 0xc82022a000) 
    /home/aditya/google-cloud-sdk/platform/google_appengine/goroot-1.6/src/net/http/server.go:1618 +0x3a 
net/http.serverHandler.ServeHTTP(0xc820078500, 0x7f4142dcb058, 0xc820234000, 0xc82022a000) 
    /home/aditya/google-cloud-sdk/platform/google_appengine/goroot-1.6/src/net/http/server.go:2081 +0x19e 
net/http.(*conn).serve(0xc82021e000) 
    /home/aditya/google-cloud-sdk/platform/google_appengine/goroot-1.6/src/net/http/server.go:1472 +0xf2e 
created by net/http.(*Server).Serve 
    /home/aditya/google-cloud-sdk/platform/google_appengine/goroot-1.6/src/net/http/server.go:2137 +0x44e 
INFO  2017-09-26 07:15:16,800 module.py:821] default: "GET /retrieve HTTP/1.1" 500 3349 

この問題を解決する方法についてはわかりません。私は、ローカルでデータストアへのアクセスを許可するために、使用してみましたが、機能しません。データストアを初期化している間にデータを保存しようとしたり、すべてのエントリを返すと、この問題に直面しています。

答えて

2

そのコンテキストを覚えておいてください代わりにcontext.Background()

func saveData(w http.ResponseWriter, r *http.Request){ 
    // .. 
    fmt.Println(input) 

    ctx := appengine.NewContext(r) 
    projectID := "api-project-426361742627" 
    // ... 
} 

のアプリのハンドラ要求から派生したコンテキストを使用するようにハンドラを更新しても同様に不透明な値コンテナとして使用することができ、App Engineの環境では、この機能を多用して。

パッケージappengine docs

+0

ありがとうございました。 –

関連する問題