airtable-fetch
A module that helps fetch an entire Airtable base or parts of it. This can be useful for running a proxy to avoid the 5/req per second API Limit.
Usage
const { AirtableFetch } = require("airtable-fetch");
or
import AirtableFetch from "airtable-fetch";
then setup with your BaseID, the structure of the views you want to fetch and your API key. The key can also be provided in the AIRTABLE_API_KEY
environment variable:
const refresh = AirtableFetch(
"appYOURBASEID",
{ TableX: ["ViewA", "ViewB"], TableY: ["ViewC"] },
"YOURAPIKEY"
);
This function returns a promise. So if you just want the data once:
const data = await AirtableFetch()();
The resulting data uses the _rawJson fields from Airtable and has the following structure:
{
"TableX": {
"ViewA": [
{
"id": "recsH4J7VZkhCDUVJ",
"fields": {},
"createdTime": "2017-07-26T09:44:36.000Z"
},
],
"ViewB": []
},
"TableY" : {
"ViewC": []
}
}
In a proxy scenario you might want to keep the function around to refresh the data periodically. Here's a little example of that using the handy json-server
.
const { AirtableFetch } = require("airtable-fetch");
const schedule = require("node-schedule");
const jsonServer = require("json-server");
const refresh = AirtableFetch("appYOURBASEID", {
TableX: ["ViewA", "ViewB"],
TableY: ["ViewC"]
});
const server = jsonServer.create();
const refreshJob = schedule.scheduleJob("*/5 * * * *", function() {
refresh().then(newData => server.use(jsonServer.router(newData)));
});
refreshJob.invoke();
server.listen(3000);
Caveats
Fetching the entire base is my goal, but while the Airtable Schema API is not public, I can't. Once it becomes generally available I'd like fetch everything by default so the module can have the desired simplicity.
This kind of naive approach for a proxy server doesn't really scale to huge bases, but neither does Airtable, really, so its fine (for me, for now).
Changelog
0.1.2
0.1.1
0.1.0