2 回答

TA貢獻1829條經驗 獲得超7個贊
這些datastore包使用gRPC連接到數據存儲服務。您不能直接在 App Engine 上使用它,因為您不能直接建立 TCP 連接。
您需要使用socketsAPI 為您建立 TCP 連接:
import "google.golang.org/appengine/socket" // et al
ctx := appengine.NewContext(r)
ctx, cancel := context.WithTimeout(ctx, 5*time.Second)
defer cancel()
dialer := func(addr string, timeout time.Duration) (net.Conn, error) {
return socket.DialTimeout(ctx, "tcp", addr, timeout)
}
client, err := datastore.NewClient(ctx, "app-id", cloud.WithGRPCDialOption(grpc.WithDialer(dialer)))
您也可以dialer在調試時直接調用,以確保它能夠按預期訪問 datastore.googleapis.com:443:
conn, err := dialer("datastore.googleapis.com:443", 5*time.Second)
if err != nil {
log.Errorf(ctx, "Dial: %v", err)
http.Error(w, "Dial failed: "+err.Error(), http.StatusInternalServerError)
return
}
fmt.Fprintf(w, "Addr: %v\n", conn.RemoteAddr())
conn.Close()

TA貢獻1884條經驗 獲得超4個贊
我的問題的解決方案是切換數據存儲庫
從: "google.golang.org/cloud/datastore"
到: "google.golang.org/appengine/datastore"
appengine/datastore 似乎使用了不同的協議,因此您不必使用 GOOGLE_APPLICATION_CREDENTIALS 環境變量進行身份驗證。在本地使用時,它將為不同的應用程序引擎服務使用開發服務器,在部署時使用云資源。
- 2 回答
- 0 關注
- 133 瀏覽
添加回答
舉報