JS调用GCS API执行文件拷贝时循环内增量值不更新问题求助
问题根源
copiedFileAmout是createNewTemplateFolder的局部变量,每调用一次该函数都会重新初始化为0,单个拷贝任务执行完最多只能将该变量加到1,永远不可能达到5,计数逻辑完全失效。- 原
loopFiles中调用异步函数createNewTemplateFolder时没有加await,也没有收集所有异步任务的状态,不等拷贝任务执行就直接返回了响应,不会等待拷贝完成再执行后续逻辑。 - 计数逻辑错误写在了单个拷贝任务内部,正确逻辑应该是在上层调度函数中统一等待所有拷贝任务完成后,再执行后续的
uploadCombineDelete。
修复方案
1. 改写上层调度函数loopFiles
统一收集所有拷贝任务的Promise,等待全部执行完成后再触发后续操作和返回响应:
const fileNamesToCopy = ['index.html', 'main.css','script.js','video.js','videocss.css']; const loopFiles = async(request,response) =>{ console.log(request.body) // 存储所有拷贝任务的Promise const copyTasks = [] for (const fileNameEach of fileNamesToCopy) { const srcFilePath = originalFolder + fileNameEach; const destFilePath = newFolderPath + fileNameEach; copyTasks.push(createNewTemplateFolder(bucketName, srcFilePath, bucketName, destFilePath)); } try { // 等待所有拷贝任务完成,要求所有任务都成功则用Promise.all,允许部分失败仍执行后续则用Promise.allSettled await Promise.all(copyTasks); // 所有拷贝完成后再执行目标函数 uploadCombineDelete(newFolderPath); response.send("Folder Created ok."); } catch (err) { console.error('拷贝任务失败:', err); response.status(500).send("文件拷贝失败"); } }
2. 简化拷贝函数createNewTemplateFolder
移除无效的计数逻辑,仅负责单个文件的拷贝操作:
const createNewTemplateFolder = async (srcBucketName, srcFilename, destBucketName, destFileName) =>{ // 执行单个文件拷贝 await storage .bucket(srcBucketName) .file(srcFilename) .copy(storage.bucket(destBucketName).file(destFileName)); console.log('copy done '+ destFileName); }
内容的提问来源于stack exchange,提问作者carol chaw
相关产品推荐
相关产品推荐

