【发布时间】:2021-09-03 15:46:55
【问题描述】:
我是 Airtable 的新手,我不确定如何使用 Airtable 命令以更简单的方式完成查询。
基地 我有一个包含两个表的 API:班级和学生。班级表由班级和每个班级注册的所有学生组成。学生表由学生和每个学生注册的所有班级组成。
任务 用户在前端搜索特定学生。使用 Airtable 公式,我需要在学生表中查询学生正在学习的课程。 (注意:我需要返回班级名称,而不是这些班级的记录 ID/代码,这对于用户来说是难以理解的。)使用这些班级名称,然后我需要询问与每个班级关联的学生的班级表,再次返回学生的实际姓名,而不是他们的记录 ID/代码。最后,我需要将原始学生的课程以及与这些课程关联的其他学生姓名返回到前端。我想我需要运行一个窗口函数或其他东西,但我不确定如何使用 Airtable 来实现。
为清楚起见,这是我目前使用的代码。我意识到它非常笨拙,但我无法在网上找到很多文档。
router.get('/:name', async (req, res) => {
try {
// Retrieve submitted student
res.setHeader('Access-Control-Allow-Origin', '*');
const URL = 'http://api.airtable.com/v0/app8ZbcPx7dkpOnP0/students';
const query = '?filterByFormula=';
const filterBy = `SEARCH("${req.params.name}", {Name} )`;
const link = `${URL}${query}${filterBy}`;
const KEY = process.env.AIRTABLE_API_KEY;
const headers = {
headers: {
Authorization: `Bearer ${KEY}`
}
}
const { data } = await axios.get(`${link}`, headers);
const records = data.records;
console.log("Object by record:", records);
const classes = records[0].fields['Classes'];
console.log("Classes by record:", classes);
let classNames = [];
let studentIds = [];
let otherStudents = [];
let zippedData = [];
let resultData;
// Swap class codes for class names
for (let i = 0; i < classes.length; i++) {
base('Classes').find(classes[i], function (err, record) {
if (err) { console.error(err); return; }
classNames.push(record.fields.Name);
});
}
// Retrieve other student codes per class associated to chosen student
for (let i = 0; i < classes.length; i++) {
base('Classes').find(classes[i], function (err, record) {
if (err) { console.error(err); return; }
studentIds.push(record.fields['Students']);
});
}
// Associate other student codes to associated student names. Zip data to send to Reducer.
setTimeout(async function () {
for (let i = 0; i < studentIds.length; i++) {
let newTempArr = [];
for (let j = 0; j < studentIds[i].length; j++) {
base('Students').find(studentIds[i][j], function (err, record) {
if (err) { console.error(err); return; }
newTempArr.push(record.fields.Name);
});
}
otherStudents.push(newTempArr);
}
}, 500);
setTimeout(function () {
for (let i = 0; i < classNames.length; i++) {
let newTempArr = [];
newTempArr.push(classNames[i]);
for (let j = 0; j < otherStudents[i].length; j++) {
newTempArr.push(otherStudents[i][j] + ", ");
}
zippedData.push(newTempArr);
}
}, 750);
setTimeout(function () {
console.log("Class names: ", classNames);
console.log("Records of other students by class:", studentIds);
console.log("Records of other student names:", otherStudents);
console.log("Zipped array:", zippedData);
resultData = { zippedData: zippedData, name: req.params.name.toString(), loading: false };
console.log(resultData);
res.send(resultData);
}, 1000);
} catch (err) {
return res.send({ zippedData: [["Name/class do not exist in Airtable database", "Associated students do not exist in Airtable database"]], name: "Error", loading: false });
}})
我在弄清楚如何在 Airtable 中正确实现异步性方面也遇到了问题,但我已经在另一个线程中发布了我对该主题的问题。
即使是不完整的解决方案也会很有帮助,这样我就可以更好地了解该采取哪个方向来减少这种野兽的冗长。
提前感谢您的任何见解! -贾斯汀
【问题讨论】:
标签: javascript airtable