错误:在发送https请求时获取地址信息失败 - Node.js和API

3

我正在开发一个仪表板,需要连接到一个API并获取授权令牌,然后使用HTTPS协议发送信息。我使用Nodejs,在运行代码时在pm2 monit上出现以下错误:

Error: getaddrinfo ENOTFOUND my.url.net/path
at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:67:26) {
errno: -3008,
code: 'ENOTFOUND',
syscall: 'getaddrinfo',
hostname: 'my.url.net/path'
}

这里是我发起请求的代码(Node.js):

const path = require('path');
require('dotenv').config({path: path.join('path','.env')});
const https     = require('https');
const database = require('./sql');
const fs         = require ('fs');

const user = process.env.USER;
const pwd  = PWD;
const host = 'https://my.url.net/extencio';
const host_1 = 'my.url.net/extention';

async function getLoginToken(pForce){

 if (login_token.Health && !pForce) { return login_token }

  //Creates the POST request
  const options = {
    protocol: 'https:',
    hostname: host_1,
    path: '/api/auth/token',
    method: 'POST',
    headers: {
    'Accept': 'application/json',
    'Content-Type': 'application/json',
        }
  };

  //Body of the POST request, contains the user and password
  const post_data = JSON.stringify({username: user, password: pwd});

以下是其余的代码:
return new Promise((resolve, reject) => {

    const req = new https.request(options, (response) => {
      response.setEncoding('utf8');
      response.on('data', function(chunk){
        const output = JSON.parse(chunk);

        if(output.token){
          login_token.Health = true;
          login_token.Token  = output.token;
          resolve(login_token)
        }

        else{
          login_token.Health = false;
          login_token.Token  = '';
          resolve(login_token);
        }
        
      });
    });
    req.write(post_data);
    req.end();
    
    req.on('error', function(err) {
      console.log(err);
      login_token.Health = false;
      login_token.Token  = '';
      resolve(login_token)
    });
    
  });
}

但是在这段代码中你没有在任何地方进行HTTP请求。 - Jeremy Thille
抱歉,我的意思是HTTPS。 - Eric0607
1
但是在这段代码中,您没有进行任何HTTPS请求。 - Jeremy Thille
我已经更新了问题。 - Eric0607
3个回答

12

仅使用域名代替协议和主机名。例如:

错误:

const host = 'https://my.url.net/extencio'
const path = '/api/auth/token'

正确:

const host = 'my.url.net'
const path = '/extencio/api/auth/token'

请参考文档http.request选项的相关内容。


0

@Eric0607,你提供的错误stackoverflow.com/questions/65810720/…已经不再显示了,我可能回复得太晚了。

但是,如果你遇到了“无效的本地证书SSL错误”,这里有一个解决方法,我发现它可以解决问题。 在你的代码中禁用SSL检查,虽然不建议这样做,但它可以暂时起作用,在完成后打开它或者可能会有风险。


0

看起来正在尝试获取完整URL的getaddrinfo,而不仅仅是主机名。我会将主机名作为选项放入“my.url.net”,并使用URL的其余部分更新路径。


@Eric0607 你的意思是你已经尝试过以下内容吗?"protocol":"https", "hostname": "my.url.net", "path": "extention/api/auth/token"(我不确定路径是否正确,但它基于你的设置)请注意,协议不是“https:”。 - Simone-Cu
是的,我指的是https协议,“主机名”“my.url.net/extention”,“路径”“/api/auth/token”。我需要使用https协议,因为我有SSL证书,而且当我从http进行更改时,我会收到错误消息,只有https才能运行。错误:getaddrinfo ENOTFOUND my.url.net/extention/api/auth/token at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:67:26) { errno:-3008, code:'ENOTFOUND', syscall:'getaddrinfo', hostname:'my.url.net/extention/api/auth/token' } - Eric0607
所以,不,你没有读错。 "hostname": "my.url.net" 而不是 "my.url.net/extention"。此外,你没有仔细阅读你在问题中写的协议:它应该是 "https" 而不是 "https:",因为它没有冒号。 - Simone-Cu
我按照指示进行了更改,现在我的主机是:my.url.net,路径为:/Ext/api/auth/token。但是现在我遇到了这个错误 https://stackoverflow.com/questions/65810720/error-self-signed-certificate-in-certificate-chain-node-js有什么想法吗?非常感谢您的帮助。 - Eric0607

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接