因此,我有一个非常简单的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
3条答案
按热度按时间qxgroojn1#
有几件事可能是问题所在:
1.您需要将IPv6地址括在方括号中,如http://[::1]:3001/test
1.该服务只侦听IPv4地址,而不侦听IPv6地址。根据服务器的不同,您可能需要以不同的方式配置侦听地址
您的帖子没有包含足够的信息,无法提供更多详细信息。请编辑您的帖子,包括实际代码,服务和配置,以便我们可以进一步帮助您。
k4aesqcs2#
当您在后端URL中使用“localhost”时,默认情况下将被解析为IPv6地址
::1
。然而,查看后端服务器代码,后端正在侦听0.0.0.0
,即IPv4。您需要让后端侦听IPv6:
emeijp433#
两个答案都指出了这个问题,你的服务器只监听IpV4的ip,但是你的“localhost”被翻译成了IpV6。
在Mac/Linux中检查Map的一种方法是检查/etc/hosts的内容,你会看到这样的东西:
最后一个ip(::1)是localhost的IPv6格式。一个快速的方法是从你的主机文件中注解IPv6,并尝试是否解决了这个问题(只需在该行的开头添加#):
如果这解决了问题,你仍然需要使用IPv6,那么你必须检查你的服务器的配置(但有时我们无法控制我们的服务器是如何配置的,所以这将做的伎俩)