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 关注
- 112 浏览
添加回答
举报