【问题标题】:Want to Optimize Airtable Query with Better Operators想用更好的算子优化 Airtable 查询
【发布时间】: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


    【解决方案1】:

    伙计,不要尝试从 Airtable 的文档中学习甚至只是复习 HTTPS 和 JavaScript 的复杂性。他们的文档可以说是业内最好的,但它的编写并不是为了让任何尚未经常处理大量 API 的人都可以访问。对于无代码平台来说,这绝对是一个愚蠢的错误,但事实就是如此。

    关于你的问题,你没有说你卡在哪里。那个请求不成立?往哪里扔?

    无论哪种方式,我都建议您通过Autocode,Syncic 或两者都注册一个免费帐户来省去麻烦。任何一方都可以立即执行您想要的操作,每天数百次,而不会超出其免费计划的限制。这显然只是一个创可贴的解决方案,但听起来你已经受到了很多胁迫,所以这可能是你采取的最不伤脑筋的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-18
      • 1970-01-01
      • 2019-06-18
      • 2016-02-08
      • 1970-01-01
      • 2015-06-02
      • 1970-01-01
      • 2021-12-11
      相关资源
      最近更新 更多