@google/genai SDK中ai.files.upload方法忽略abortSignal未抛出异常问题咨询
AbortController not working with @google/genai files.upload in Vue.js
从你的代码和描述来看,这个问题大概率是**@google/genai SDK的files.upload方法没有正确实现AbortSignal的中断逻辑**,而非你的代码写法错误。以下是具体分析和解决方案:
为什么会出现这个现象?
SDK内部未绑定AbortSignal到请求:
很多SDK在封装上传逻辑时,可能没有把你传入的abortSignal真正关联到底层的网络请求(比如fetch或XMLHttpRequest)上。虽然你调用了abort()让signal.aborted变为true,但SDK的上传流程根本没监听这个信号的变化,所以会继续执行直到上传完成。小Blob导致上传过快:
你用的是极小的测试Blob,可能在你点击“Abort”按钮时,上传请求已经在本地处理完成甚至发送到服务器了,这时候再触发abort当然不会有效果。不过你提到“能快速点击取消”却依然上传成功,这个可能性比较小,但可以用大文件验证排除。
验证与排查步骤
- 测试大体积文件:生成一个几MB的Blob(比如
new Blob([new ArrayBuffer(1024*1024*5)], { type: "audio/mp3" })),这样上传耗时更长,给你足够的时间触发abort,看是否依然会完成上传。 - 核对SDK文档参数:再次确认
files.upload的参数说明,是否abortSignal确实应该放在config对象里。有些SDK可能要求直接把signal作为顶层参数传入,而非嵌套在config中。 - 查看SDK源码:如果有条件,可以查看
@google/genai的files.upload实现代码,看它是否在内部请求中使用了传入的abortSignal。如果没有,那就是明确的SDK bug。
临时解决方案(Workaround)
如果暂时等不到SDK修复,可以在上传完成后手动检查信号状态,主动抛出AbortError:
async function sendRequest() { abortController = new AbortController(); try { console.log("Uploading blob"); const mockAudioBlob = new Blob(["fake audio bytes"], { type: "audio/mp3" }); const myFile = await ai.files.upload({ file: mockAudioBlob, config: { abortSignal: abortController.signal } }); // 手动检查信号是否已中止 if (abortController.signal.aborted) { throw new DOMException("Request was aborted", "AbortError"); } result.value = myFile.uri; console.log(myFile.uri); console.log("Aborted? " + abortController.signal.aborted); } catch (e) { if (e && e.name === "AbortError") { console.log("Request was aborted"); } else { console.log(e); } } finally { abortController = null; } }
这个方法虽然不能真正中断上传进程(因为请求已经发出去了),但可以在前端层面模拟预期的中断行为,避免处理已取消的上传结果。
结论
这个现象更倾向于SDK的bug,建议你去Google GenAI SDK的官方仓库提交issue,描述清楚你的复现步骤和代码,让官方团队修复这个问题。
内容的提问来源于stack exchange,提问作者Curio
相关产品推荐
相关产品推荐

