gatsby-source-serverless-aurora
A Gatsby source plugin for pulling data into Gatsby at build time from an AWS Serverless Aurora database.
Quick Start
Install the plugin:
npm install --save-dev gatsby-source-serverless-auroraAdd the plugin to gatsby-config.js with your Serverless Aurora connection details and any queries you want to perform.
module.exports = {
//... your config here
plugins: [
{
resolve: `gatsby-source-serverless-aurora`,
options: {
connection: {
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
region: process.env.AWS_REGION,
resourceArn: process.env.AURORA_RESOURCE_ARN,
secretArn: process.env.AURORA_SECRET_ARN,
databaseName: process.env.AURORA_DB_NAME,
},
queries: [
{
nodeName: `page`,
statement: `SELECT * FROM pages`,
idFieldName: `page_id`,
},
],
},
},
],
};Re/start your development server with gatsby develop, open GraphiQL and query it like this:
{
allServerlessAuroraPage {
edges {
node {
id
type
row {
page_id
title
}
}
}
}
}Plugin Options
These are all the options you can pass to the plugin:
| Option | Required | Default | Description |
|---|---|---|---|
| connection.accessKeyId | Required | An AWS access key ID. | |
| connection.secretAccessKey | Required | An AWS secret access key. | |
| connection.region | Required | The region for your Serverless Aurora instance. | |
| connection.resourceArn | Required | The Resource ARN for your Serverless Aurora instance. | |
| connection.secretArn | Required | The Secret ARN for your Serverless Aurora instance. | |
| connection.databaseName | Required | The name of the database to use for queries. Can be overridden in each query. | |
| queryBatchSize | 10 |
The maximum number of simultaneous queries to perform. | |
| queries[].nodeName | Required | Gives a name to the nodes created by the query, e.g. “page”. | |
| queries[].statement | Required | The query to perform. | |
| queries[].idFieldName | "id" |
The column to use for the unique ID of the Gatsby nodes. | |
| queries[].databaseName | Optionally query a different database for this query only. | ||
| queries[].parentNodeName | Optionally link nodes created by this query as children of node(s) created by another query. | ||
| queries[].parentMatcher | Optionally filter the parent nodes found with parentNodeName. See below for usage. |
Parent-Child Relationships
Parent-child relationships can easily be created between different nodes. Parents can have as many children as they like, and children can have as many parents as they like.
Example
- You have a query
"page"to return pages:SELECT * FROM pages. - You have a query
"post"to return posts:SELECT * FROM posts. - For the
postquery you specify theparentNodeNameas"page". - For the
postquery you specify theparentMatcher()function to match thepage_idof the post to thepage_idof the page. - Use the
links.children.posts[]property to access thepostsowned by apagenode. - Use the
links.parents.pages[]property to access thepagesapostnode belongs to.
queries: [
{
nodeName: `page`,
statement: `SELECT * FROM pages`,
idFieldName: `page_id`,
},
{
nodeName: `post`,
statement: `SELECT * FROM posts`,
idFieldName: `post_id`,
parentNodeName: `post`,
parentMatcher: (post, page) => post.page_id === page.page_id,
},
],Query it like:
{
allServerlessAuroraPage {
edges {
node {
id
type
row {
page_id
title
}
links {
children {
posts {
id
row {
post_id
title
}
}
}
}
}
}
}
}parentMatcher(child, parent) => boolean
The parentMatcher function is passed two nodes, child and parent. It must return true if the child should be linked to the parent, otherwise false.
The child parameter will be a node returned by the current query, and the parent parameter will be a node with a name that matches the parentNodeName option if specified (or all nodes returned by all queries if not).