【问题标题】:Why I can't send request from one localhost to another?为什么我不能将请求从一个本地主机发送到另一个?
【发布时间】:2022-10-16 21:52:49
【问题描述】:

我想将请求从一个本地主机发送到在同一台机器上运行的另一个本地主机。 第一个是localhost:3000,第二个是localhost:3005

下面的代码来自试图向:3000发送请求的:3005

return new Promise<EventResponse>((resolve, reject) => {
    const httpOptions= {
      hostname: "http://localhost:3000", //not working also without http/https
      method: 'POST',
      path: '/api/something',
      headers: {
        "Content-Type": "application/json",
      }
    }
    const request = http.request(httpOptions, (res: IncomingMessage) => {
      res.setEncoding("utf8");
      res.on("error", reject);
    });

    request.on("error", (err) => {
      console.log("ERROR: ", err); //ENOTFOUND
      reject;
    });

    request.on("timeout", () => {
      request.destroy();
      reject({
        statusCode: 400
      });
    });

    request.write(JSON.stringify(payload));
    request.end();
  });

有人可以告诉我为什么上面的代码会抛出这个:

ERROR:  Error: getaddrinfo ENOTFOUND 127.0.0.1:3000
    at GetAddrInfoReqWrap.onlookup [as oncomplete] (node:dns:71:26) {
  errno: -3008,
  code: 'ENOTFOUND',
  syscall: 'getaddrinfo',
  hostname: '127.0.0.1:3000'
}

我确定:3000 服务器在发送此请求期间正在运行。

谢谢你的帮助!

【问题讨论】:

  • 当您在浏览器中打开localhost:3000 时,它是否有效?

标签: javascript node.js typescript http


【解决方案1】:

错误消息非常清楚:它说它找不到名为127.0.0.1:3000 的主机,这是完全可以理解的,因为冒号字符: 在主机名、IPv4 地址和IPv6 地址中是非法的。

3000 是端口号,不是主机名的一部分。您必须通过 3000 作为端口和 127.0.0.1localhost 作为主机名:

const httpOptions= {
  hostname: "localhost",
  port: 3000,
  method: 'POST',
  path: '/api/something',
  headers: {
    "Content-Type": "application/json",
  }
}

请注意,这同样适用于 http://:正斜杠 / 在主机名、IPv4 地址和 IPv6 地址中也是非法的。 HTTP 是协议,它不是主机名的一部分。 HTTP 是http.request 的默认协议,因此无需传递。如果你想要一个不同的协议(例如 HTTPS),你必须通过它:

const httpOptions= {
  hostname: "localhost",
  port: 3000,
  protocol: 'https:',
  method: 'POST',
  path: '/api/something',
  headers: {
    "Content-Type": "application/json",
  }
}

如果我不得不猜测,我会说问题的根本原因是您混淆了 URI、主机名、协议和端口。但这只是一个猜测。

【讨论】:

    【解决方案2】:

    我会试试这个:

    const httpOptions= {
      hostname: "localhost",
      port: 3000,
      method: 'POST',
      path: '/api/something',
      headers: {
        "Content-Type": "application/json",
      }
    }
    

    【讨论】:

      【解决方案3】:

      你不应该像这样在hostname 中声明portprotocol。 像这样修改您的httpOptions

      const httpOptions= {
         hostname: "localhost",
         port: 3000,
         method: 'POST',
         path: '/api/something',
         headers: {
           "Content-Type": "application/json",
        }
      }
      

      您可以在这里阅读更多关于httpOptions 的信息:Node HTTP.request([options])

      【讨论】:

        猜你喜欢
        • 2018-07-12
        • 1970-01-01
        • 2013-08-17
        • 2014-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多