返回数组的异步谷歌表读取函数调用后得到不可迭代对象问题
错误原因
- 异步函数
getData()的返回值是Promise实例,你直接将调用结果赋值给data变量,此时data存储的是Promise对象本身,不是异步执行完成后返回的数组。你在then回调中没有接收Promise返回的结果,直接对Promise对象调用forEach数组方法,自然会报不可迭代的错误。 - 其余附加错误:
then回调没有定义参数接收异步返回的数组结果forEach方法无返回值,你将它的执行结果赋值给present_list只会得到undefined,同时你调用了JS数组不存在的append方法,数组添加元素应该用push- 代码存在语法错误:
console.log(Array.isArray(data);缺少右闭合括号
修正代码
import dotenv from "dotenv"; import { google } from "googleapis"; import { mainModule } from "process"; dotenv.config(); const spreadsheetID = process.env.spreadsheetID; if (process.env.NODE_ENV == "production") { var fs = require("fs"); fs.writeFile("./secrets.json", process.env.SECRET, (err: any) => { if (err) console.error('写入密钥文件失败', err); }); } async function getData() { const auth = new google.auth.GoogleAuth({ keyFile: "secrets.json", scopes: "https://www.googleapis.com/auth/spreadsheets", }); const client = await auth.getClient(); const googleSheets = google.sheets({ version: "v4", auth: client }); const getRows = await googleSheets.spreadsheets.values.get({ auth: auth, spreadsheetId: spreadsheetID, range: "Sheet1", }); console.log(getRows.data.values); console.log(Array.isArray(getRows.data.values)) return getRows.data.values; } // 用then接收异步返回的数组 getData().then(data => { console.log(Array.isArray(data)); console.log(data); // 筛选符合条件的元素直接用filter方法更简洁 const present_list = data.filter((user: any) => user[4] === "P"); console.log(present_list); }); console.log("asdasd");
如果你偏好forEach写法,可以替换筛选部分的代码:
const present_list = []; data.forEach((user: any) => { if (user[4] === "P") { present_list.push(user); } });
如果你的Node版本支持顶层await,也可以用更直观的写法:
const data = await getData(); const present_list = data.filter((user: any) => user[4] === "P"); console.log(present_list);
内容的提问来源于stack exchange,提问作者Chuah Zi Yang
相关产品推荐
相关产品推荐

