You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker环境下NodeJS调用MS Graph API遇fetch failed错误求助

问题

NodeJS应用使用microsoft-graph-client库调用MS Graph API操作OneDrive文件,本地运行一切正常,但在Docker环境中执行获取文件内容的请求时出现TypeError: fetch failed错误,不过Batch请求可正常执行。

触发错误的请求代码:

const response = await this.client
      .api('users/{userID}/drive/root:/myapp/' + filename + '.pptx:/content')
      .get();

错误信息:

TypeError: fetch failed
    at Object.fetch (node:internal/deps/undici/undici:11372:11)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5) {
  statusCode: -1,
  code: 'TypeError',
  requestId: null,
  date: 2023-11-13T15:50:09.758Z,
  body: 'TypeError: fetch failed',
  headers: undefined
}

解决思路与方案

1. 检查Docker容器网络连通性

  • 先验证容器能否访问MS Graph域名:执行docker exec <容器ID> ping graph.microsoft.com,如果无法ping通,排查容器网络模式(比如是否使用host网络、自定义网络的DNS配置是否正常)。
  • 若环境需要代理,在Docker中配置代理变量:
    在Dockerfile中添加:
    ENV HTTP_PROXY=http://你的代理地址:端口
    ENV HTTPS_PROXY=http://你的代理地址:端口
    ENV NO_PROXY=localhost,127.0.0.1
    
    或者启动容器时通过参数传递:
    docker run -e HTTP_PROXY=http://你的代理地址:端口 -e HTTPS_PROXY=http://你的代理地址:端口 <镜像名称>
    

2. 调整Node.js的undici/fetch配置

错误来自Node.js内置的undici库(fetch底层实现),可能是Docker环境的连接限制导致:

  • 创建Graph Client时手动配置fetch选项,增加超时或禁用HTTP/2:
    const { Client } = require('@microsoft/microsoft-graph-client');
    const { TokenCredentialAuthenticationProvider } = require('@microsoft/microsoft-graph-client/authProviders/azureTokenCredentials');
    const { DefaultAzureCredential } = require('@azure/identity');
    const undici = require('undici');
    
    const credential = new DefaultAzureCredential();
    const authProvider = new TokenCredentialAuthenticationProvider(credential, {
      scopes: ['https://graph.microsoft.com/.default']
    });
    
    const client = Client.initWithMiddleware({
      authProvider,
      fetchOptions: {
        dispatcher: new undici.Agent({
          connectTimeout: 30000, // 设置30秒连接超时
          keepAliveTimeout: 30000,
          http2: false // 禁用HTTP/2,部分Docker环境可能不兼容
        })
      }
    });
    
    需先安装undici依赖:npm install undici

3. 改用流式处理文件请求

获取文件内容会返回二进制数据,和Batch请求的JSON响应处理逻辑不同,Docker环境可能对大响应的内存处理有限制:

  • 将请求改为流式获取,避免一次性加载大文件:
    const response = await this.client
      .api('users/{userID}/drive/root:/myapp/' + filename + '.pptx:/content')
      .responseType('stream')
      .get();
    
    // 示例:将流写入本地文件
    const fs = require('fs');
    const writeStream = fs.createWriteStream('./output.pptx');
    response.pipe(writeStream);
    

4. 对齐本地与Docker的Node.js版本

本地和Docker环境的Node.js版本差异可能导致undici行为不一致:

  • 在Dockerfile中指定与本地一致的Node.js版本,比如:
    FROM node:18-alpine
    

内容的提问来源于stack exchange,提问作者Илья Никитин

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 09:40:05