我正在尝试让 Google 的 Dialogflow v2 Node.js SDK 中的 Dialogflow SDK 示例正常工作。我正在使用 node.js v8.10.0
,dialogflow node.js SDK 版本 0.5.0
。我在尝试运行“检测意图”示例时遇到了这个问题,从企业 http/s 代理后面:
Auth error:Error: write EPROTO 140163148314432:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:../deps/openssl/openssl/ssl/s23_clnt.c:827
我在这里看到这篇文章:https://medium.com/google-cloud/accessing-google-cloud-apis-though-a-proxy-fe46658b5f2a这看起来非常面向 Java,但它建议设置环境变量 GRPC_PROXY_EXP
以使 gRPC 调用在代理后面工作。我在使用 export GRPC_PROXY_EXP="$https_proxy"
运行节点的 shell 中设置了环境变量,并尝试再次运行示例,但出现了同样的问题。请注意,我的 $http_proxy
、$https_proxy
变量是相同的。
当连接到没有代理的 wifi 网络时,同一示例在同一台机器上运行;和 tcpdump
数据包分析表明有两个 TCP 连接(不同的端口)正在使用中:一个有效(并且首先打开),另一个无效,并且遇到错误代理人。第二个连接立即开始 CLIENT_HELLO
TLS 消息,当它需要首先验证并向 HTTPS 代理发送 CONNECT
消息时(与第一个 TCP 连接一样)。
我是否遗漏了什么,或者这是 dialogflow (google-gax/grpc) 节点库的问题?
最佳答案
在几个 Google 节点项目问题讨论板上反复讨论后,问题原来是 - 当使用 HTTPS over HTTP 隧道时 - gtoken
API 直接使用axios
npm 包只准备使用 HTTPS(与 URL 中的协议(protocol)一致)。
长话短说; Dialogflow 0.8.2
包含此问题的修复程序,因为它的传递依赖项包括使用 gaxios
而不是 的
。 gtoken
包版本>axiosgaxios
是 google-gax
库中其他地方使用的一个包,用于建立 HTTP/S 连接(代理感知,并处理 HTTPS over HTTP 用例)。
关于proxy - Node.js 中的 Google GAX/gRPC 不支持 HTTP/S 代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51479697/