使用msgraph-sdk-javascript的putStream上传大文件遇socket hang up问题
解决Microsoft Graph API putStream上传大文件时的socket hang up问题
这个ECONNRESET/socket hang up错误在上传稍大文件时出现,核心原因大概率是请求超时或者流传输过程中未正确处理中断。虽然Graph API支持4MB以内的单文件上传,但Node.js SDK的默认配置可能不足以支撑800KB文件的传输耗时(尤其是网络条件一般的情况下)。下面是几个针对性的解决方案:
1. 延长请求超时时间
SDK默认的HTTP请求超时通常比较短(比如10秒左右),800KB的文件如果网络速率一般,很容易超过这个时间导致连接被切断。你可以在API调用时单独设置超时,或者全局配置:
单个请求设置超时
client.api(ep + ':' + realxlspath + ':/content') .timeout(30000) // 设置为30秒,可根据实际网络情况调整 .putStream(stream, function(err) { if (err) reject(err); else resolve(true); });
全局配置超时(所有请求生效)
const client = Client.init({ authProvider: authProvider, requestOptions: { timeout: 30000 // 全局设置30秒超时 } });
2. 捕获文件流的错误
有时候文件读取过程中出现的错误(比如文件损坏、权限问题)会间接导致传输中断,但因为没有监听流的错误事件,最终表现为socket hang up。给读取流添加错误监听,提前排查问题:
var stream = fs.createReadStream(self.files[0].path); // 监听文件流的错误 stream.on('error', (streamErr) => { console.error('读取文件时出错:', streamErr); reject(streamErr); }); // 再执行上传 client.api(ep + ':' + realxlspath + ':/content') .timeout(30000) .putStream(stream, function(err) { if (err) reject(err); else resolve(true); });
3. 改用Promise/async-await风格调用
回调风格的处理有时候会掩盖一些异步过程中的问题,试试用Promise化的方式调用(新版SDK已经支持Promise返回),代码更清晰也更容易捕获错误:
var stream = fs.createReadStream(self.files[0].path); stream.on('error', (streamErr) => reject(streamErr)); try { await client.api(ep + ':' + realxlspath + ':/content') .timeout(30000) .putStream(stream); resolve(true); } catch (err) { reject(err); }
4. 排查网络/代理环境
如果你的运行环境有HTTP代理,代理服务器可能设置了更短的超时时间,导致连接被提前中断。可以尝试直接连接网络测试,或者配置SDK的代理参数:
const client = Client.init({ authProvider: authProvider, requestOptions: { timeout: 30000, proxy: 'http://your-proxy-server:port' // 根据实际代理配置 } });
为什么小文件没问题?
小文件(100KB以内)传输耗时短,能在SDK默认的超时窗口内完成整个请求,所以不会触发超时中断。而800KB的文件传输时间超过了默认阈值,就会出现socket hang up错误。
内容的提问来源于stack exchange,提问作者Juan
相关产品推荐
相关产品推荐

