从 localhost:3000 获取到 localhost:8000 时出现 ECONNREFUSED (Nextjs - DjangoApp)

Tom*_*anc 11 django node.js reactjs econnrefused fetch-api

当尝试在前端和后端(React Next.js 和 Django)之间使用“fetch”节点函数发出“POST”请求时,我收到“ECONNREFUSED”错误。

使用 Postman 的后端请求按预期工作。

Django 位于端口:8000,Next.js 位于端口:3000。

它一直在工作,直到我安装了 XCode、Ionic 和 Capacitor 包(我真的不知道它们是否是我收到此错误的原因)。

这是错误:

TypeError: fetch failed
    at Object.fetch (node:internal/deps/undici/undici:11118:11)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async __WEBPACK_DEFAULT_EXPORT__ (webpack-internal:///(api)/./src/pages/api/account/login.js:18:28)
    at async Object.apiResolver (/Users/tomas.leblanc/Dev/HermesApp/frontend/node_modules/next/dist/server/api-utils/node.js:185:9)
    at async DevServer.runApi (/Users/tomas.leblanc/Dev/HermesApp/frontend/node_modules/next/dist/server/next-server.js:395:9)
    at async Object.fn (/Users/tomas.leblanc/Dev/HermesApp/frontend/node_modules/next/dist/server/base-server.js:496:37)
    at async Router.execute (/Users/tomas.leblanc/Dev/HermesApp/frontend/node_modules/next/dist/server/router.js:226:36)
    at async DevServer.run (/Users/tomas.leblanc/Dev/HermesApp/frontend/node_modules/next/dist/server/base-server.js:606:29)
    at async DevServer.run (/Users/tomas.leblanc/Dev/HermesApp/frontend/node_modules/next/dist/server/dev/next-dev-server.js:450:20)
    at async DevServer.handleRequest (/Users/tomas.leblanc/Dev/HermesApp/frontend/node_modules/next/dist/server/base-server.js:321:20) {
  cause: Error: connect ECONNREFUSED ::1:8000
      at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1300:16) {
    errno: -61,
    code: 'ECONNREFUSED',
    syscall: 'connect',
    address: '::1',
    port: 8000
  }
}
Run Code Online (Sandbox Code Playgroud)

如果有人可以帮助我处理这个错误,那就太好了!

如果您需要更多详细信息或项目文件,请填写询问:D

编辑1:

如果我启动前端应用程序,并尝试执行 fetch 函数,它将显示上面的 arrero,但首先会显示以下内容:

(node:10488) ExperimentalWarning: The Fetch API is an experimental feature. This feature could change at any time
(Use `node --trace-warnings ...` to show where the warning was created)
Run Code Online (Sandbox Code Playgroud)

不过不应该是这个原因。

编辑2:

我确实将 Node.js 版本从“v18.11.0”降级到“v16.17.1”,现在可以工作了!

chr*_*ove 9

我似乎遇到了同样的问题,它看起来与 IP6 有关。我可以看到您在堆栈跟踪中使用 IP6:address: '::1'

显然版本16以上的nodejs中的IP6存在问题。我认为是由此更改触发的:https://www.reddit.com/r/ipv6/comments/qbr8jc/nodejs_finally_prefers_ipv6_addresses_over_ipv4/

您可以通过以下方式绕过此问题:

  1. 使用硬编码的 ip4 地址,例如 127.0.0.1
  2. 在 Linux 中禁用 ip6 支持:请参阅https://www.techrepublic.com/article/how-to-disable-ipv6-on-linux
  3. 首先配置节点使用 IP4 地址。在 Node.js 中使用 fetch 向 localhost 发出请求时,请参阅ECONNREFUSED
import dns from 'node:dns';
dns.setDefaultResultOrder('ipv4first');
Run Code Online (Sandbox Code Playgroud)

如果有人能说出为什么 IP6 不能(总是?)在最新版本的 Nodejs 中工作。我很高兴听到这个消息。


Tom*_*anc 3

将 Node.js 从 v18 降级到 v16 解决了该问题。