Google Datastore 仍然指向 App Engine 生产数据库而不是本地模拟器

Posted

技术标签:

【中文标题】Google Datastore 仍然指向 App Engine 生产数据库而不是本地模拟器【英文标题】:Google Datastore still pointing to App Engine production database instead of local emulator 【发布时间】:2018-04-11 21:49:46 【问题描述】:

我有一个正在本地构建的本地 NodeJS 应用程序。

我希望本地应用程序指向本地 Datastore Emulator(而不是生产 Cloud Datastore)。

我按照此页面上的说明进行操作...但是,应用程序仍指向 CLOUD 数据存储(不是我的本地数据存储)。我确认了这一点,因为数据显示在 App Engine 的数据存储实体页面中。

根据此页面,https://cloud.google.com/datastore/docs/tools/datastore-emulator 所需要的只是通过运行以下命令来设置环境变量:

$(gcloud beta emulators datastore env-init)

我确认环境变量设置正确。为什么我的应用程序仍然指向 Cloud Datastore 而不是本地模拟器?

myusername$ $(gcloud beta emulators datastore env-init)
myusername$ gcloud beta emulators datastore env-init
export DATASTORE_DATASET=projectname
export DATASTORE_EMULATOR_HOST=localhost:8081
export DATASTORE_EMULATOR_HOST_PATH=localhost:8081/datastore
export DATASTORE_HOST=http://localhost:8081
export DATASTORE_PROJECT_ID=projectname

这是运行模拟器时的输出:

myname$ gcloud beta emulators datastore start
WARNING: Reusing existing data in [/Users/myname/.config/gcloud/emulators/datastore].
Executing: /Users/myname/google-cloud-sdk/platform/cloud-datastore-emulator/cloud_datastore_emulator start --host=localhost --port=8081 --store_on_disk=True --consistency=0.9 --allow_remote_shutdown /Users/myname/.config/gcloud/emulators/datastore
[datastore] Oct 30, 2017 3:47:46 PM com.google.cloud.datastore.emulator.CloudDatastore$FakeDatastoreAction$8 apply
[datastore] INFO: Provided --allow_remote_shutdown to start command which is no longer necessary.
[datastore] Oct 30, 2017 3:47:46 PM com.google.cloud.datastore.emulator.impl.LocalDatastoreFileStub <init>
[datastore] INFO: Local Datastore initialized:
[datastore]     Type: High Replication
[datastore]     Storage: /Users/myname/.config/gcloud/emulators/datastore/WEB-INF/appengine-generated/local_db.bin
[datastore] Oct 30, 2017 3:47:47 PM com.google.cloud.datastore.emulator.impl.LocalDatastoreFileStub load
[datastore] INFO: The backing store, /Users/myname/.config/gcloud/emulators/datastore/WEB-INF/appengine-generated/local_db.bin, does not exist. It will be created.
[datastore] Oct 30, 2017 3:47:47 PM io.gapi.emulators.netty.NettyUtil applyJava7LongHostnameWorkaround
[datastore] INFO: Unable to apply Java 7 long hostname workaround.
[datastore] API endpoint: http://localhost:8081
[datastore] If you are using a library that supports the DATASTORE_EMULATOR_HOST environment variable, run:
[datastore] 
[datastore]   export DATASTORE_EMULATOR_HOST=localhost:8081
[datastore] 
[datastore] Dev App Server is now running.
[datastore] 

【问题讨论】:

我在 python 环境中遇到了完全相同的问题。显然,SDK 没有考虑环境变量。很奇怪。 我建议提出我的问题,这样它可能会得到更多关注。我还没有找到解决办法。 我设法让事情顺利进行。基本上,您仍然需要为您的应用程序提供真实的凭据,尽管指南告诉您只需设置环境变量。完成此操作后,让环境变量指向正确的值就可以了。您想显示任何代码吗? 【参考方案1】:

我发现设置 DATASTORE_EMULATOR_HOSTDATASTORE_PROJECT_ID 就足够了。

也许它正在寻找其他指向云的环境变量?

您是否尝试过清除 GOOGLE_APPLICATION_CREDENTIALS 环境变量?

【讨论】:

以上是关于Google Datastore 仍然指向 App Engine 生产数据库而不是本地模拟器的主要内容,如果未能解决你的问题,请参考以下文章

App Engine 上 Cloud Datastore 的客户端库 - NDB 或 google-cloud-datastore

Google App Engine / Datastore / Flask / Python app 中的内存泄漏

探索Google App Engine背后的奥秘- Datastore的设计

Google App Engine Datastore 中的索引和索引条目限制

如何在 Google App Engine 的 Datastore 模型中获取行数?

Google App Engine Datastore 集成测试