next.js API调用适用于IPv4地址(127.0.0.1),但收到“错误:使用localhost时,connect EASPMENT REFUSED::1:3001”

yhxst69z  于 2023-10-18  发布在  其他
关注(0)|答案(3)|浏览(237)

因此,我有一个非常简单的API调用,在http://localhost:3001/test的前端使用fetch,它给了我一个错误:Error: connect ECONNREFUSED ::1:3001
但是,当我直接调用那个API时(将API URI直接输入到我的浏览器中),它工作得很好。同样,当我在前端fetch调用中将localhost更改为http://127.0.0.1:3001/test时,也可以工作。
这似乎是一个网络错误,因为::1和127.0.0.1解析到相同的地址,但一个是IPv4,另一个是IPv6,对吗?有人知道为什么会这样吗?
前端获取(前端_URL = http://localhost:3001):

export async function getStaticProps() {
  const res = await fetch(`${BACKEND_URL}/explore`, {
    method: 'GET',
    headers: {
      "Content-Type": 'application/json',
      Origin: BASE_URL,
    },
  });

  ...
}

后端服务器侦听端口3001(PORT = 3001):

const PORT = process.env.PORT;
app.listen(PORT, '0.0.0.0', () => {
    console.log(`Server is running on port ${PORT}`);
});

堆栈:NextJS前端,NextJS后端,MongoDB Atlas DB,NextAuth用于auth

qxgroojn

qxgroojn1#

有几件事可能是问题所在:
1.您需要将IPv6地址括在方括号中,如http://[::1]:3001/test
1.该服务只侦听IPv4地址,而不侦听IPv6地址。根据服务器的不同,您可能需要以不同的方式配置侦听地址
您的帖子没有包含足够的信息,无法提供更多详细信息。请编辑您的帖子,包括实际代码,服务和配置,以便我们可以进一步帮助您。

k4aesqcs

k4aesqcs2#

当您在后端URL中使用“localhost”时,默认情况下将被解析为IPv6地址::1。然而,查看后端服务器代码,后端正在侦听0.0.0.0,即IPv4。
您需要让后端侦听IPv6:

const PORT = process.env.PORT;
app.listen(PORT, '::', () => {
    console.log(`Server is running on port ${PORT}`);
});
emeijp43

emeijp433#

两个答案都指出了这个问题,你的服务器只监听IpV4的ip,但是你的“localhost”被翻译成了IpV6。
在Mac/Linux中检查Map的一种方法是检查/etc/hosts的内容,你会看到这样的东西:

##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting.  Do not change this entry.
##
127.0.0.1   localhost
255.255.255.255 broadcasthost
::1             localhost

最后一个ip(::1)是localhost的IPv6格式。一个快速的方法是从你的主机文件中注解IPv6,并尝试是否解决了这个问题(只需在该行的开头添加#):

127.0.0.1   localhost
255.255.255.255 broadcasthost
#::1             localhost

如果这解决了问题,你仍然需要使用IPv6,那么你必须检查你的服务器的配置(但有时我们无法控制我们的服务器是如何配置的,所以这将做的伎俩)

相关问题