Next.js服务端无法从Synology NAS获取文件:连接超时问题求助
问题
我在Next.js应用中从Synology NAS获取数据时遇到连接超时问题:
- Next.js服务端发起
fetch请求时触发Connect Timeout Error - 相同请求用
curl命令或浏览器发起完全正常
报错信息如下:
⨯ unhandledRejection: TypeError: fetch failed at Object.fetch (node:internal/deps/undici/undici:11576:11) at process.processTicksAndRejections (node:internal/process/task_queues:95:5) { cause: ConnectTimeoutError: Connect Timeout Error at onConnectTimeout (node:internal/deps/undici/undici:8522:28) at node:internal/deps/undici/undici:8480:50 at Immediate._onImmediate (node:internal/deps/undici/undici:8511:13) at process.processImmediate (node:internal/timers:476:21) at process.callbackTrampoline (node:internal/async_hooks:130:17) { code: 'UND_ERR_CONNECT_TIMEOUT'
排查与解决步骤
1. 确认服务端网络环境一致性
- 本地开发时,在Next.js项目所在的终端窗口执行和服务端完全相同的
curl请求,验证Node进程所在环境是否能访问NAS - 若用Docker部署Next.js,检查容器网络模式是否和主机同网段,能否ping通NAS的IP(浏览器/curl跑在主机网络,容器可能处于隔离网络)
2. 调整fetch超时配置
Next.js服务端的fetch基于undici,默认超时比浏览器/curl短,手动设置更长超时:
const res = await fetch('http://你的NAS地址/接口路径', { signal: AbortSignal.timeout(10000) // 设为10秒,根据实际情况调整 });
3. 检查NAS的访问限制
- 登录Synology DSM,确认防火墙规则允许Next.js服务端所在IP访问
- 检查NAS的目标服务(如File Station API、WebDAV)是否设置了IP白名单,将服务端IP加入允许列表
- 确认NAS的端口是否正确开放,无其他服务占用冲突
4. 核对请求参数一致性
- 对比服务端
fetch的URL、请求头、参数和curl/浏览器的请求是否完全一致:- 避免相对路径解析错误(服务端环境下相对路径可能指向错误地址)
- 检查Cookie、Authorization等请求头是否在服务端正确携带
- 若用HTTPS,确认NAS的证书是否被Node信任(可临时关闭证书验证测试:
fetch(url, { rejectUnauthorized: false }),仅用于排查)
5. 调整Node.js网络配置
- 检查代理环境变量:执行
echo $HTTP_PROXY $HTTPS_PROXY,浏览器/curl可能用了系统代理,但Node进程未继承,若不需要代理则清空变量后重启服务 - 自定义undici代理配置,调整连接超时和存活时间:
import { Agent } from 'undici'; const agent = new Agent({ connectTimeout: 10000, keepAliveTimeout: 30000 }); const res = await fetch('http://你的NAS地址/接口路径', { agent });
内容的提问来源于stack exchange,提问作者Jonathan
相关产品推荐
相关产品推荐

