使用Promise.all停止SQL实例时遇TypeError:中间值不可迭代,求排查
解决Promise.all中TypeError: (intermediate value) is not iterable的问题
这个错误的根源很明确:你在尝试对sqladmin.instances.patch()返回的结果做数组解构,但实际上这个方法返回的并不是可迭代的数组,而是一个单一的Operation对象。
具体问题分析
你代码里的这行是触发错误的关键:
const [operation] = await sqladmin.instances.patch(request);
Google Cloud SQL Admin API的instances.patch()方法返回的Promise会直接解析为一个Operation实例,而不是包含单个元素的数组。当你用[operation]这种数组解构语法去接收非数组的值时,JS就会抛出"(intermediate value) is not iterable"的错误。
修正方案
只需要把数组解构改为直接赋值即可,修改后的完整代码如下:
const { google } = require('googleapis') const { auth } = require('google-auth-library') const sqladmin = google.sqladmin('v1beta4') exports.stopSqlInstance = async (event, context, callback) => { try { const authRes = await auth.getApplicationDefault() var sqlInstancesList = ["my-instance-name"]; await Promise.all( sqlInstancesList.map(async (instance) => { console.info("stopping " + instance); var request = { auth: authRes.credential, project: "my-project-id", instance: instance, requestBody: { "settings": { "activationPolicy": "NEVER" } } } // 去掉数组解构,直接接收返回的Operation对象 const operation = await sqladmin.instances.patch(request); // 等待异步操作完成 return operation.promise(); }) ); // 所有实例停止操作完成 const message = `Successfully stopped instance(s)`; console.log(message); callback(null, message); } catch(err) { console.error(err); callback(err); } }
额外调试建议
如果以后遇到类似的API返回值结构不确定的问题,可以先临时打印返回结果,比如:
const result = await sqladmin.instances.patch(request); console.log('API返回结果:', result);
这样能直观看到返回值的结构,避免错误的解构方式。
内容的提问来源于stack exchange,提问作者dina
相关产品推荐
相关产品推荐

