node.js - 当您查询数据存储模拟器时,如何强制 @google-cloud/datastore 使用“http”
问题描述
我有一个 node + vuejs 应用程序,我试图从中查询我的本地数据库(使用数据存储模拟器创建)。
我的代码是这样的
const { Datastore } = require('@google-cloud/datastore')
const datastore = new Datastore({
apiEndpoint: "http://localhost:<port>",
projectId: <my_project_name>
})
然后,我尝试运行 Google文档中的示例查询之一
我的输出显示连接成功,但随后我在控制台中收到以下错误
POST https://localhost:<port>/$rpc/google.datastore.v1.Datastore/RunQuery net::ERR_SSL_PROTOCOL_ERROR
从错误中,我看到它已更改http://localhost:<port>
为,https://localhost:<port>
即它正在为我的本地主机强制协议https
,然后显然失败。
我必须指定一些东西/选项以确保它http
在我进行本地调用或使用数据存储模拟器时使用?
解决方案
我找到了解决方案并发布它以防其他人遇到问题。
我开始浏览代码本身并发现了对这个链接的引用。页面说
.....默认情况下,客户端库将使用 gRPC,它是基于 HTTP/2 的二进制传输。它是 Node.js 实现,@grpc/grpc-js,使用 Node.js http2 模块。如果需要在非 Node.js 环境中使用客户端库,或者当 gRPC 因任何原因无法使用时,可以使用 HTTP/1 回退模式。在这种模式下,使用特殊的与浏览器兼容的传输实现来代替 gRPC 传输。 在浏览器上下文中(如果定义了 window 对象),回退模式会自动启用;如果您需要覆盖此行为,请将 options.fallback 设置为 false ....
当我添加fallback:false
到选项时,一切正常,即它不再重定向到 https,而是连接到我的数据模拟器。
我进一步考虑了一下,我相信这种行为是因为我的代码是renderer process
为 Vuejs 应用程序编写的,这意味着有一个windows
对象。为了确认,我将代码移到了main process
并且没有包含该fallback
选项并且它有效。
推荐阅读
- google-cloud-platform - 需要帮助配置 Stackdriver 警报的条件
- reactjs - 如何为 Material-ui TextField Type=date 设置默认日期
- symfony - 如何更改实体中的数据库列类型
- java - 卡夫卡:当连接在消费者完成阅读主题之前中断时会发生什么?
- php - 解析具有多行声明版本和编码的 XML 文档时的 SimpleXML 错误
- keras-2 - 加载 Keras 数据集 mnist
- python - Selenium 等待 visibility_of_all_elements_located 超时
- xamarin - 如何从视图模型访问 Prism.ioc 容器?
- javascript - Cheerio 获取部分标签内 p 标签的内容
- c# - C# 使用 Linq to XML 对 XML 文件进行排序