我有一个运行在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会破坏这个功能,我如何让它重新工作?
1条答案
按热度按时间zazmityj1#
好吧,显然在Node 17中有一个变化,它改变了
localhost
解析成的顺序,参见https://github.com/nodejs/undici/issues/1602。Django默认不监听IPv6。所以我可以总是在IPv6上启动Django,或者只是将localhost
更改为127.0.0.1
,我现在已经使用了。编辑:
第三种选择是在
hooks.server.ts
中包含以下代码: