首页 > 解决方案 > 当您查询数据存储模拟器时,如何强制 @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在我进行本地调用或使用数据存储模拟器时使用?

标签: node.jsvue.jselectrongoogle-cloud-datastore

解决方案


我找到了解决方案并发布它以防其他人遇到问题。

我开始浏览代码本身并发现了对这个链接的引用。页面说

.....默认情况下,客户端库将使用 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选项并且它有效。


推荐阅读