node.js - 多个 API 使用节点 js 生成一个数组/对象
问题描述
我想在每一行谷歌表格上调用一个 API。API 将在所有行完成后返回我想要推送到数组中的 JSON 对象。我想对这个数组做进一步的处理。
例如 resultArr = [ {first Api result}, {second api result} .... 以此类推]
下面是我的代码,我试了一下
const axios = require("axios");
const assert = require("assert");
const path = require("path");
const fs = require("fs");
const { GoogleSpreadsheet } = require("google-spreadsheet");
const doc = new GoogleSpreadsheet("ABCDEFGHIJKLMOPQRSTUVWxyz");
doc.useApiKey("ABCDEFGHIJKLMOPQRSTUVWxyz");
let jsonRowArr = ["initial"];
async function test1() {
await doc.loadInfo();
const sheet = doc.sheetsByIndex[0]; /* or use doc.sheetsById[id] */
/* read all rows */
const rows = await sheet.getRows(); // can pass in { limit, offset }
rows.forEach(async (row, index) => {
let heading = row["_sheet"]["headerValues"];
fieldValue = {};
let rowValue = row["_rawData"];
heading.forEach((key, i) => {
fieldValue[key] = rowValue[i];
});
//start here
let APIParam = {
test_name: `test ${index}`,
shipping_method: {
before_decimal_point: fieldValue["Before Decimal"],
after_decimal_point: fieldValue["After Decimal"],
closest_round: "100",
},
shipping_price: fieldValue["3 Digit"],
method_name: "get_shipping_after_round",
expected_rate_up: ["Expected Down 3"],
expected_rate_down: ["Expected Up"],
};
APIAfterApiData = await apiCallNewFn(APIParam);
await jsonRowArr.push("dsv");
await jsonRowArr.push(APIAfterApiData);
});
return await jsonRowArr;
}
apiCallNewFn = async (params) => {
let { data } = await axios.post(
"http://api.example.com/call_function.php",
null,
{
params,
}
);
// console.log('data...', data);
data["test_name"] = await params.test_name;
data["expected_rate_up"] = await params.expected_rate_up;
data["expected_rate_down"] = await params.expected_rate_down;
return await data;
};
(async () => {
let customTestObj = await test1();
console.log("I want fianl result here");
console.log(customTestObj);
console.log("for further process");
})();
解决方案
这个改装怎么样?在这个修改中,我使用了apiCallNewFn
返回 Promise。并且使用 for 循环代替 forEach。Ref当你的脚本被修改时,它变成如下。在此修改中,test1()
并apiCallNewFn
进行了修改。
test1()
:
async function test1() {
await doc.loadInfo();
const sheet = doc.sheetsByIndex[0];
const rows = await sheet.getRows();
for (let index = 0; index < rows.length; index++) {
const row = rows[index];
let heading = row["_sheet"]["headerValues"];
fieldValue = {};
let rowValue = row["_rawData"];
heading.forEach((key, i) => {
fieldValue[key] = rowValue[i];
});
let APIParam = {
test_name: `test ${index}`,
shipping_method: {
before_decimal_point: fieldValue["Before Decimal"],
after_decimal_point: fieldValue["After Decimal"],
closest_round: "100",
},
shipping_price: fieldValue["3 Digit"],
method_name: "get_shipping_after_round",
expected_rate_up: ["Expected Down 3"],
expected_rate_down: ["Expected Up"],
};
APIAfterApiData = await apiCallNewFn(APIParam);
jsonRowArr.push("dsv");
jsonRowArr.push(APIAfterApiData);
}
return jsonRowArr;
}
apiCallNewFn()
:
const apiCallNewFn = async (params) => {
return axios
.post(
"http://api.example.com/call_function.php",
null,
{
params,
}
)
.then((res) => {
let data = { res: res.data };
data["test_name"] = params.test_name;
data["expected_rate_up"] = params.expected_rate_up;
data["expected_rate_down"] = params.expected_rate_down;
return data;
});
};
或者
const apiCallNewFn = async (params) => {
return axios
.post(
"http://api.example.com/call_function.php",
null,
{
params,
}
)
.then((data) => {
data["test_name"] = params.test_name;
data["expected_rate_up"] = params.expected_rate_up;
data["expected_rate_down"] = params.expected_rate_down;
return data;
});
};
笔记:
- 关于
apiCallNewFn
,请修改脚本以获得您期望的结果。
推荐阅读
- api - 用于获取账单详细信息的 Zoom API 未经授权的错误
- node.js - 使用 React 和 nodejs 上传文件:无法在“HTMLInputElement”上设置“value”属性:
- rust - 我的测试在“尝试用溢出减去”时失败
- typescript - 如何在映射的打字稿函数签名中维护可选参数
- swiftui - 存储进度观察器未更新我的 ProgressView
- r - 当我使用选择输入时,用户界面中出现错误
- javascript - TypeError: addTicket is not a function - UseState in modal to print in another page
- php - 教义持久集合转换为树枝的字符串
- java - 在 Firebase 中查询组的正确做法
- json - 如何从 JSON "EDate" 中读取值:{ }