【问题标题】:Why do I get ECONNREFUSED in the terminal, but not the browser?为什么我在终端中得到 ECONNREFUSED 而不是浏览器?
【发布时间】:2021-02-20 04:03:03
【问题描述】:

我有一个非常简单的 nodejs 程序,用于演示与 Alchemer API 的通信。每当我运行以下代码时,代码ECONNREFUSED 都会引发错误。但是,当我将相同的 url 复制到浏览器或 Postman 中时,它工作得很好。

注意 - 我注意到一件奇怪的事情,在错误的堆栈跟踪(见下文)中,它说地址是 127.0.0.1,尽管我显然没有向我的本地主机发出请求......

Nodejs 代码段

require('dotenv').config();
const https = require('https');
const querystring = require('querystring');

console.log('Formulating query string...');

const params = {
    api_token: process.env.API_TOKEN,
    api_token_secret: process.env.API_TOKEN_SECRET
};

const reqArgs = querystring.stringify(params);

console.log('Query string: ', reqArgs);

const reqOptions  = {
    url: 'https://api.alchemer.com',
    path: '/v5/survey?' + reqArgs,
}

console.log('Test Url: ', reqOptions.url + reqOptions.path); // THIS WORKS IN THE 
BROWSER / POSTMAN
console.log('Getting data...');

https.request(reqOptions, resp => {
    let data = '';

    resp.on('data', chunk => {
        data += chunk;
    });

    resp.on('error', err => {
        console.error(JSON.stringify(err));
    });

    resp.on('end', () => {
        console.log('Request complete.');
        console.log(data);
    });
});

观察到错误

events.js:292
      throw er; // Unhandled 'error' event
      ^

Error: connect ECONNREFUSED 127.0.0.1:443
    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1146:16)
Emitted 'error' event on ClientRequest instance at:
    at TLSSocket.socketErrorListener (_http_client.js:469:9)
    at TLSSocket.emit (events.js:315:20)
    at emitErrorNT (internal/streams/destroy.js:106:8)
    at emitErrorCloseNT (internal/streams/destroy.js:74:3)
    at processTicksAndRejections (internal/process/task_queues.js:80:21) {
  errno: -61,
  code: 'ECONNREFUSED',
  syscall: 'connect',
  address: '127.0.0.1',
  port: 443
}

【问题讨论】:

  • 尝试将reqOptions中的host属性显式设置为https://api.alchemer.com

标签: node.js api https query-string econnrefused


【解决方案1】:

根据https.requests 文档here,URL 似乎不是在请求选项中设置 URL 的正确属性名称。

考虑将reqOptions 上的url 键更改为hostnamehost

const reqOptions  = {
    hostname: 'https://api.alchemer.com',
    path: '/v5/survey?' + reqArgs,
}

【讨论】:

  • 谢谢!这解决了我的 ECONNREFUSED 错误,但现在我在延迟几秒钟后收到 ECONNRESET。正如我所提到的,生成的 url 在浏览器和邮递员中工作得很好,但是这个 nodejs 库不断给我新的错误......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-01
  • 2023-01-21
  • 2016-10-19
  • 2021-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多