当我向谷歌api发送请求时(使用axios或https),例如https://www.googleapis.com/blogger/v3/blogs/2399953?key=...

我总是犯"Client network socket disconnected before secure TLS connection was established"错误.

但如果我把请求发送到https://api.github.com,效果就很好.我用谷歌搜索了错误,但找不到多少有用的信息.这里https://github.com/nodejs/node/issues/21088说,如果服务器使用TLS 1.0,这可能会发生,但显然不是我的情况.

我也试了googleapis次,但还是犯了同样的错误.

知道如何修复错误吗?

----更新----

我的问题在5个月前就结束了.我在对古格里皮的比赛中开了an issue分,但也被关闭了.我已经放弃了,但令我惊讶的是,车流量一直在增加.所以我更新了我的问题,希望它能重新开放.

首先,谷歌api已经移到了https://github.com/googleapis/google-api-nodejs-client

第二,只需使用vpn在那里运行the first example(使用vpn,因为谷歌服务因任何原因被阻止),我将获得connect ETIMEDOUT,同时我可以从浏览器获得结果.

const {google} = require('googleapis');
const blogger = google.blogger({
  version: 'v3',
  auth: 'YOUR API KEY'
});

blogger.blogs.get({blogId: '3213900'}, (err, res) => {
  if (err) {
    console.error(err);
    throw err;
  }
  console.log(`The blog url is ${res.data.url}`);
});
//But I can get result in browser https://blogger.googleapis.com/v3/blogs/3213900?key=xxx

我认为这个问题是可以解决的,因为nodejs不通过我的vpn代理发送请求.所以我的问题和这个有点关联,What could cause "connect ETIMEDOUT" error when the URL is working in browser?

但那里的解决方案对我不起作用.在这篇SO How can I use an http proxy with node.js http.Client?文章中,有一个答案提到使用request,它是有效的!

var request = require("request");

request(
  {
    url:
      "https://blogger.googleapis.com/v3/blogs/3213900?key=xxx",
    method: "GET",
    proxy: my-vpn-proxy,
  },
  function (error, response, body) {
    if (!error && response.statusCode == 200) {
      console.log(body);
    }
  }
);

太糟糕了,请求被否决了!我不能让axios也工作!

我也试了tunnel次,得到了read ECONNRESET error次;我试了global-tunnel-ng次,结果出错了

TypeError: Cannot read property 'proxy' of undefined
    

但是https-proxy-agent也行,

var url = require('url');
var https = require('https');
var HttpsProxyAgent = require('https-proxy-agent');
 
// HTTP/HTTPS proxy to connect to
var proxy = 'my-vpn-proxy';

var endpoint = 'https://blogger.googleapis.com/v3/blogs/3213900?key=xxx';
var opts = url.parse(endpoint);
 
var agent = new HttpsProxyAgent(proxy);
opts.agent = agent;
 
https.get(opts, function (res) {
  console.log('"response" event!', res.headers);
  res.pipe(process.stdout);
});

所以我认为这个问题是可以解决的.

推荐答案

问题被重新打开后,我对谷歌api提出了another issue分,最终得到了答案!

所以google api支持使用proxy check here

Node.js相关问答推荐

请求正文未定义

控制台显示一个长对象,我可以';每当我发布更新Mongoose数据库的请求时,我都不知道错误是什么,

Nestjs重写子类dto nodejs中的属性

GitLab 依赖扫描需要源代码中的 package-lock.json 才能执行

我如何在nodejs中的路由之间交换令牌

NodeJS `request` 库无法通过 multipart-form-data 将文件发布到 dotnet 服务器

Next.js 在我的电脑上没有构建错误,但它们在使用 Vercel 部署时发生

如何为单个 mongo nodejs 驱动程序找到最佳连接池大小

NPM 错误:修复upstream 依赖冲突安装 NPM 包(云功能)

Nodejs mongoose 在一个查询中从多个集合中获取结果

在 Express.js 中迭代子文档数组

如何让我的 Next.js 应用在运行 ubuntu-latest 的 Azure 应用服务中启动?

如何在拦截器中发送不同的请求?

响应发送 200 而不是 403

为什么 req.params.id 返回 undefined未定义?

Dart 语言比 JavaScript (Node.js) 有什么好处

如何解决'npm应该在 node repl之外运行,在你的普通shell中'

为什么 Node 控制台不显示功能代码?

Node.js, require.main === 模块

什么时候应该将函数存储到变量中?