Список записей с помощью Airtable API

У меня есть база Airtable, из которой я могу извлекать записи (см. код ниже), но я хотел бы получить значение для других полей, кроме «Местоположение». Используя «console.log('Retrieved: ', record.get('Location'));», как мне изменить эту строку, чтобы включить в вывод значения поля для поля «Размер» в дополнение к полю «Местоположение»? Я пробовал "console.log('Retrieved: ', record.get('Location', 'Size'));", но это не сработало.

Вот фрагмент моего кода:

// Lists 3 records in Bins 
base('Bins').select({
    // Selecting the first 3 records in Grid view:
    maxRecords: 3,
    view: "Grid view"
}).eachPage(function page(records, fetchNextPage) {
    // This function (`page`) will get called for each page of records.

    records.forEach(function(record) {
        console.log('Retrieved: ', record.get('Location'));
    });

    // To fetch the next page of records, call `fetchNextPage`.
    // If there are more records, `page` will get called again.
    // If there are no more records, `done` will get called.
    fetchNextPage();

}, function done(err) {
    if (err) { console.error(err); return; }
});

ВЫВОД

Получено 170000118

Получено 170000119

Получено 170000120


person Hackbrew    schedule 27.06.2018    source источник


Ответы (2)


Я нашел этот репо, чтобы помочь, когда я пытался создать такие ситуации. Обертка для общих функций доступа к данным в базе данных airtable.com. Все запросы возвращают обещания.

Вот как это работает, если вы хотите избежать использования пакета npm. Но, в конечном счете, суть заключается в том, чтобы либо использовать запрос, либо какой-то другой метод выполнения обещания для извлечения Записей.

import Airtable from 'airtable'
import _ from 'lodash'

const ENDPOINT_URL = 'https://api.airtable.com'
let API_KEY // Can only set the API key once per program

export default class AirTable {

    constructor({apiKey, databaseRef}) {
        if(!API_KEY) {
            API_KEY = apiKey
            Airtable.configure({
                endpointUrl: ENDPOINT_URL,
                apiKey: API_KEY
            });
        }
        this.base = Airtable.base(databaseRef)
        this.get = {
            single: this.getSingleRecordFrom.bind(this),
            all: this.getAllRecordsFrom.bind(this),
            match: this.getAllMatchedRecordsFrom.bind(this),
            select: this.getRecordsSelect.bind(this)
        }
        this.insert = this.createRecord.bind(this)
        this.add = this.insert
        this.create = this.insert

        this.update = this.updateRecord.bind(this)
        this.set = this.update

        this.remove = this.deleteRecord.bind(this)
        this.delete = this.remove
        this.destroy = this.remove
        this.rem = this.remove
    }

    async createRecord({tableName, data}) {
        return new Promise((resolve, reject) => {
            this.base(tableName).create(data, (err, record) => {
                if (err) {
                    console.error(err)
                    reject()
                    return
                }
                console.log("Created " + record.getId())
                resolve(record)
            })
        })
    }

    async updateRecord({tableName, id, data}) {
        return new Promise((resolve, reject) => {
            this.base(tableName).update(id, data, (err, record) => {
                if (err) {
                    console.error(err)
                    reject()
                    return
                }
                console.log("Updated " + record.getId())
                resolve(record)
            })
        })
    }

    async deleteRecord({tableName, id, data}) {
        return new Promise((resolve, reject) => {
            this.base(tableName).destroy(id, (err, record) => {
                if (err) {
                    console.error(err)
                    reject()
                    return
                }
                console.log("Deleted " + record.getId())
                resolve(record)
            })
        })
    }

    async getSingleRecordFrom({tableName, id}) {
        console.log(tableName, id)
        return new Promise((resolve, reject) => {
            this.base(tableName).find(id, function(err, record) {
            if (err) {
                console.error(err)
                reject(err)
            }
            resolve(record)
            })
                // console.log(record);
        })
    }

    async getAllRecordsFrom(tableName) {
        return this.getRecordsSelect({tableName, select: {} })
    }

    async getAllMatchedRecordsFrom({tableName, column, value}) {
        return this.getRecordsSelect({tableName, select: {filterByFormula:`${column} = ${value}`} }) // TODO: validate input
    }

    async getRecordsSelect({tableName, select}) {
        return new Promise((resolve, reject) => {
            let out = []
            this.base(tableName).select(select).eachPage((records, fetchNextPage) => {
                // Flatten single entry arrays, need to remove this hacky shit.
                _.map(records, r => {
                    _.forOwn(r.fields, (value, key) => { // If array is single
                        if(_.isArray(value) && value.length == 1 && key != 'rooms') {
                            r.fields[key] = value[0]
                        }
                    });
                })
                out = _.concat(out, records)
                fetchNextPage();
            }, (err) => {
                if (err) {
                    console.error(err)
                    reject(err)
                } else {
                    // console.log(JSON.stringify(out, null, 4))
                    // console.log("HI")
                    resolve(out)
                }
            })
        })
    }
}

Надеюсь, это имеет смысл. Также попробуйте сделать API-прокси, извлекающий всю таблицу, или даже использовать Express для извлечения идентификатора записи, поскольку массивы также могут работать.

person Nicholas Cappello    schedule 26.09.2018
comment
это должно получить доступ ко всем таблицам сразу?! - person daniel assayag; 09.10.2020

Вы можете использовать эту строку кода.

records.forEach(function(record) {
    console.log('Retrieved: ', record.get('Location') + ' ' + record.get('Size'));
});
person Blueshark    schedule 19.12.2019
comment
Не просто размещайте код! Поскольку вы нашли хорошее решение, у вас есть все возможности объяснить его. - person hc_dev; 20.12.2019
comment
Airtable поддерживает эту функциональность, поэтому вы можете получить значение поля в базе Airtable, используя record.get('имя поля'). Если у вас есть другие вопросы, не стесняйтесь спрашивать меня. - person Blueshark; 21.12.2019