0

我有一个对 http GET 数据的 API 调用,一次 100 条记录。

它有一个 GET URL 参数: ?offset=

可以设置为获取所有结果。

最初我认为偏移量为 0,必须进行测试,但随后为 101、201、301。

第一次提取将获得记录 1..100。

我从这个(下面的代码)开始,获取前 100 条记录,但我不确定这里的循环是什么样的,因为我不知道最终有多少记录,我不知道如何退出循环。

如果有人有这方面的经验,并且可以将此代码示例、修改并作为回复发布,将非常感激。


同样在 await 内,是否需要axios.get()调用processRecords()

await processRecords(),然后async processRecords()呢?

我得到错误,如果我指定await processRecords(),我试图理解这一点。


这是一个实际的工作示例,它将获取前 100 条记录,我想循环,递增?offset=<next start number>直到全部获取。

function processRecords() {
    console.log('processRecords()');
    // do stuff
}

const processTable = async () => {
    const url = `https://api.airtable.com/v0/` + atApiBaseKey + `/` + atTableName;

    const headers = {
        'Authorization': "Bearer " + atApiKey,
        'Content-Type': "application/json"
    };

    try {
        let offset = 0;    // no initial offset
        let params = {
            maxRecords: 100,
            offset: offset
        };

        /**
         * how to loop here over await axios.get() ?
         *
         * what would a for loop look like here, incrementing offset by 100
         * each time?
         *
         * and how would the loop exit?
         *
         */

        await axios.get(url, {params: params, headers: headers})
            .then((response) => {
                processRecords(response.data.records);  // process 100 records

                //console.log(response.data);
                //console.log(response.status);
                //console.log(response.statusText);
                //console.log(response.headers);
                //console.log(response.config);
                console.log('')
            });
    } catch (error) {
        console.error(error)
    }
};

谢谢你!

4

2 回答 2

0

当函数使我的程序崩溃时,这是一个递归版本。

const axios = require('axios')

let results = []
let baseURL = "https://api.airtable.com/v0/baseid/tablename"
let headers = { authorization: "Bearer " + 'yourkey' }
let params = { pageSize: 100}

axios({
    baseURL: baseURL,
    headers: headers,
    params: params
}).then(res =>  { results.push(...res.data.records)
    params.offset = res.data.offset
        const axcall = () => { axios({
            baseURL: baseURL,
            headers: headers,
            params: params }
            ).then( 
                res =>  { results.push(...res.data.records)
                    params.offset = res.data.offset

                    if (res.data.offset !== undefined) {
                    return axcall() }
                    else { // after all calls ends
                      console.log(results)
                    }
                }
            ).catch(e => console.log(e))
            }
            axcall()
}).catch(e => console.log(e) );
于 2020-05-08T21:34:23.483 回答
0

Airtable 提供了一个 JavaScript SDK,它有一些帮助函数来完成这个任务。 https://github.com/Airtable/airtable.js。您还可以查看https://airtable.com/api上的交互式文档,以查看有关如何遍历每个记录页面的示例。

未记录的是all为您管理迭代并提取所有记录的调用函数:

const Airtable = require("Airtable");

var base_id = "YOUR_BASE_ID";
var base = Airtable.base(base_id);
var table_name = "YOUR_TABLE_NAME";

var table = base.table(table_name);
table.select().all()
  .then((records) => {
    console.log(records);
  })
  .catch((err) => {
    console.log("ERR: ", err);
  });

如果你想使用 axios 并创建自己的客户端,你可以。该offset参数是从之前的 API 响应中返回的。如果它存在于 API 响应中,那么您需要获取更多页面。如果它不存在,那么您已经遍历了给定表中的所有记录:

const axios = require('axios');

const processTable = async () => {
  const url = `https://api.airtable.com/v0/` + atApiBaseKey + `/` + atTableName;

  const headers = {
    'Authorization': "Bearer " + atApiKey,
    'Content-Type': "application/json"
  };

  let offset = null; // no initial offset

  // use the pageSize parameter to control the number of records in each page
  // maxRecords controls the total number of records the API will ever return
  let params = {
    pageSize: 1,
    offset: offset
  };

  // create an array to hold all of our records
  let records = [];

  try {
    // make the request
    let response = await axios.get(url, {
      params: params,
      headers: headers
    });

    // push the resulting records into our array
    records.push(...response.data.records);

    // check if we have an offset
    offset = response.data.offset;

    // continue looping and making requests until there is no more offset
    // if there is no offset, then return the list of records
    while (offset !== undefined) {
      params = {
        offset: offset
      };
      let response = await axios.get(url, {
        params: params,
        headers: headers
      });
      records.push(...response.data.records);
      offset = response.data.offset;
    }
  } catch (error) {
    console.error(error)
  }
  return records;

};
processTable()
  .then((records) => {
    console.log(records);
  }).catch((err) => {
    console.log("ERR: ", err);
  })

强烈建议使用 Airtable JS SDK 来消除这种复杂性。

于 2019-12-28T19:10:28.943 回答