升级到Node 18后,从SvelteKit SSR访问localhost突然中断

ejk8hzay  于 2023-06-29  发布在  Node.js
关注(0)|答案(1)|浏览(152)

我有一个运行在localhost:3000上的SvelteKit网站,以及一个运行在localhost:8000上的Django API。SvelteKit网站通过访问localhost:8000与API进行对话,无论是在SSR还是在客户端,这都一直工作得很好。直到今天。
突然之间,这不再起作用,当我试图从SSR向API发出请求时,我在控制台中得到了这个错误:

TypeError: fetch failed
    at fetch (/Users/kevin/Workspace/project_name/node_modules/.pnpm/undici@5.22.1/node_modules/undici/index.js:109:13)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async Promise.all (index 2)
    at async fetchUserMiddleware (/Users/kevin/Workspace/project_name/src/middleware.ts:59:5)
    at async copyCookieValues (/Users/kevin/Workspace/project_name/src/middleware.ts:21:10)
    at async redirectMiddleware (/Users/kevin/Workspace/project_name/src/middleware.ts:16:10)
    at async /Users/kevin/Workspace/project_name/node_modules/.pnpm/@sentry+sveltekit@7.56.0_@sveltejs+kit@1.20.4_svelte@3.59.2/node_modules/@sentry/sveltekit/cjs/server/handle.js:111:19 {
  cause: Error: connect ECONNREFUSED ::1:8000
      at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1494:16)
      at TCPConnectWrap.callbackTrampoline (node:internal/async_hooks:130:17) {
    errno: -61,
    code: 'ECONNREFUSED',
    syscall: 'connect',
    address: '::1',
    port: 8000
  }
}

我没有做任何代码更改,但我最近运行了brew upgrade,并更新了pnpm。我正在运行Ventura 13.4.1,我没有使用Docker或类似的东西。
当我在浏览器中手动访问localhost:8000时,或者通过RapidAPI等API工具访问时,一切都非常正常,没有问题。来自SvelteKit的请求也可以正常工作,只有来自SSR的请求不工作。
当我将SvelteKit网站更改为向127.0.0.1:8000而不是localhost:8000发出请求时,SSR请求再次工作。所以我有个解决办法,但我想知道到底怎么回事。是什么突然改变了,我如何才能让它再次工作?
将代码恢复到旧版本没有区别。就像我说的,我上周五在项目上工作的时候,这曾经工作得很好,现在两天后,它突然出现了这个错误,代码没有任何变化。

编辑:我最近也从节点16更新到节点18。降级回16修复它。为什么Node 18会破坏这个功能,我如何让它重新工作?

zazmityj

zazmityj1#

好吧,显然在Node 17中有一个变化,它改变了localhost解析成的顺序,参见https://github.com/nodejs/undici/issues/1602。Django默认不监听IPv6。所以我可以总是在IPv6上启动Django,或者只是将localhost更改为127.0.0.1,我现在已经使用了。
编辑:
第三种选择是在hooks.server.ts中包含以下代码:

import dns from "node:dns";
dns.setDefaultResultOrder("ipv4first");

相关问题