yeekal
V2EX  ›  问与答

同一 百度云存储 URL, Python 请求成功、浏览器访问成功,唯独 Node.js fetch 失败

  •  
  •   yeekal · 1 day ago · 774 views

    背景:百度新出的 paddle ocr vl 1.6 ,根据其 api 文档( python 写的),在测试时会返回一个结果链接,请求该链接获取其中的 json 结果

    该链接 python requests 可以访问,本地 curl 可以访问,浏览器可以直接访问,但是在 nextjs 项目里面前后端通过 fetch 均无法访问

    链接示例: https://paddleocr-store-1.bj.bcebos.com/v1/job/b2e41a29bdef834cf1786aa41d950cdf232126f264bb994fbf98bb1eae787492/json/cc48ad7a5e6ebb092bfe10bd2619859c.json?authorization=bce-auth-v1%2FALTAKDN8mY5KlNI7zaRpLmOqrw%2F2026-06-17T07%3A28%3A33Z%2F604800%2F%2Fac27632bf11a36d6cd2f12b791dbb8015330f430ec39e4925a4d396691c88e94

    我让 deepseek 写一个单页 html(排除任何框架干扰),试图访问该链接也不行,并排除了 CORS (跨域资源共享)问题。

    其中有一个可能性是“Node.js v18/v20/v22 中的 Happy Eyeballs 机制存在已知实现缺陷,导致连接超时问题”,但是我没找到靠谱的修复方案

    有没有大佬遇到过类似问题

    Supplement 1  ·  1 day ago
    感谢各位,问题已解决。

    ai 给出的原因和解决办法:

    ```text
    问题在于 Node.js 自带的 fetch (使用 undici )与该特定主机的连接存在超时问题。而原生 https 模块在显式强制使用 IPv4 并指定 IP 地址时可以正常工作。

    根本原因:undici ( Node 的 fetch 后端)无法与 paddleocr-store-7.bj.bcebos.com 建立 TCP 连接(可能是 IPv6/TLS 握手问题),而 curl 和 Python requests 则能正常处理。

    修复方案:使用原生 https 模块,并显式进行 IPv4 查询。
    ```

    大概是说该域名的 ipv6 访问有些问题(通过我的网络), 但是 ipv4 访问是可以的,而 node 的 fetch 并没有处理好 ipv6 的链接问题。而 curl 和 Python requests 则能正常处理。

    反正就是把 fetch 换成 https 模块就可以访问了。

    另外评论区有用 node 的 fetch 可以访问成功,猜测跟不同地区的网络还有关系。

    以上略做参考
    9 replies    2026-06-17 21:45:39 +08:00
    nomansky
        1
    nomansky  
       1 day ago
    把你 request/response 打印或抓包对比下不就好了
    yeekal
        2
    yeekal  
    OP
       1 day ago
    @nomansky 对比 python 和 fetch 的么
    dislazy2023
        3
    dislazy2023  
       1 day ago
    一般是文件名的特殊字符 让 ai 处理一下
    dislazy2023
        4
    dislazy2023  
       1 day ago
    不过这也不太像
    mqnu00
        5
    mqnu00  
       1 day ago

    node fetch 没问题啊
    mqnu00
        6
    mqnu00  
       1 day ago
    @mqnu00 #5

    node v22.15.0
    QHKZ
        7
    QHKZ  
       1 day ago via iPhone
    如果 curl 没问题说明接口是正常的,那么肯定是代码有问题,最好在代码发送请求的时候打断点,看看到底发了什么请求出去,有时候一些第三方库的写法不一样结果也会不一样
    yeekal
        8
    yeekal  
    OP
       1 day ago
    @mqnu00 我用你这个版本试一下
    yeekal
        9
    yeekal  
    OP
       1 day ago   ❤️ 1
    @mqnu00 换版本也不行。最后通过改为 https 模块解决了。 猜测跟网络环境也有关系。

    ai 给出的原因和解决办法:

    ```text
    问题在于 Node.js 自带的 fetch (使用 undici )与该特定主机的连接存在超时问题。而原生 https 模块在显式强制使用 IPv4 并指定 IP 地址时可以正常工作。

    根本原因:undici ( Node 的 fetch 后端)无法与 paddleocr-store-7.bj.bcebos.com 建立 TCP 连接(可能是 IPv6/TLS 握手问题),而 curl 和 Python requests 则能正常处理。

    修复方案:使用原生 https 模块,并显式进行 IPv4 查询。
    ```

    感谢各位
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2511 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 51ms · UTC 05:41 · PVG 13:41 · LAX 22:41 · JFK 01:41
    ♥ Do have faith in what you're doing.