Crie um blog moderno com Gatsby e MongoDB
Avalie esse Tutorial
A web, como muitos outros setores, funciona de forma muito cíclica. As tendências estão constantemente nascem e re Nascem. Uma das minhas tendências favoritas que está fazendo um grande retorno são os sites estáticos e o foco no desempenho do site. O GatsbyJS apresenta uma nova maneira de construir sites que funde o estático com a dinâmica que, em minha visão, fornece uma estrutura válida para sua consideração.
No tutorial de hoje, vamos dar uma olhada em como podemos aproveitar o GatsbyJS e o MongoDB para criar um blog moderno que pode ser exibido em qualquer lugar. Veremos como o GraphQL facilita a visualização e o trabalho com nosso conteúdo, independentemente de sua origem. Obtenha o código deste repositório do GitHub para acompanhar.
Para este tutorial, você precisará de:
Você pode baixar o Node.js aqui e ele vem com a versão mais recente do npm. Para o MongoDB, você pode utilizar uma instalação existente ou o MongoDB Atlas gratuitamente. O conjunto de dados com o qual trabalharemos vem de Hakan Özlere pode ser encontrado neste repositório doGitHub. Todos os outros itens necessários serão abordados no artigo.
O aplicativo que estamos construindo hoje se chama Books Plus. É um blog que analisa livros técnicos.
O GatsbyJS é uma estrutura baseada noReact para criar sites e aplicativos de alto desempenho. A estrutura permite que os desenvolvedores utilizem o cenário moderno do JavaScript para criar rapidamente sites estáticos. O que destaca o GatsbyJS é o ecossistema construído em torno dele. Plug-ins para todos os tipos de recursos e funcionalidades interoperam facilmente para fornecer um poderoso conjunto de ferramentas para qualquer coisa que você queira que seu website faça.
A segunda funcionalidade principal do GatsbyJS é sua abordagem para as fontes de dados. Enquanto a maioria dos geradores de sites estáticos simplesmente processa arquivos Markdown em HTML, o GatsbyJS fornece um mecanismo flexível para trabalhar com dados de qualquer fonte. Em nosso artigo de hoje, utilizaremos essa funcionalidade para mostrar como podemos ter dados tanto em arquivos Markdown quanto em um MongoDB database, e o GatsbyJS lidará com tudo isso da mesma forma.
Para criar um site GatsbyJS, precisaremos instalar o Gatsby CLI. Na janela do Terminal, execute
npm install -g gatsby-cli
.Para confirmar que a CLI está instalada corretamente, execute
gatsby -help
em seu Terminal. Você verá uma lista de comandos disponíveis, como gatsby build e gatsby new. Se você ver informações semelhantes à captura de tela acima, está pronto para Go.A próxima etapa será criar um novo site GatsbyJS. Há algumas maneiras diferentes de fazer isso. Podemos começar com um aplicativo GatsbyJS básico ou um aplicativoinicial que tenha vários plug-ins já instalados. Para simplificar, optaremos pela primeira. Para criar um novo site GatsbyJS simples, execute o seguinte comando:
1 gatsby new booksplus
A execução deste comando no seu Terminal criará um novo aplicativo GatsbyJS simples em um diretório chamado
booksplus
. Quando a instalação for concluída, navegue até este novo diretório executando o cd booksplus
e, uma vez neste diretório, vamos iniciar nosso servidor de desenvolvimento GatsbyJS local. Para fazer isso, executaremos o seguinte comando em nossa janela do Terminal.1 gatsby develop
Este comando levará alguns segundos para ser executado, mas, depois de executá-lo, você poderá navegar até
localhost:8080
para ver a página inicial padrão do GatsbyJS.A página padrão não chama a atenção, mas vê-la nos diz que estamos no caminho certo. Você também pode clicar no hiperlinkGo para a página 2 para ver como o Gatsby lida com a navegação.
Se você estava prestando atenção na janela do Terminal enquanto o GatsbyJS estava construindo e iniciando o servidor de desenvolvimento, também deve ter notado uma mensagem dizendo que você pode navegar para
localhost:8000/___graphql
para explorar os dados e o esquema do seu site. Bom olho! Caso não tenha notado, não tem problema, vamos navegar para essa página também e verificar se ela carrega e funciona corretamente.O GraphQL é uma interface de usuário poderosa para trabalhar com esquemas GraphQL, que é o que o GatsbyJS gera para nós quando executamos
gatsby develop
. Todo o conteúdo dos nossos websites, incluindo páginas, imagens, componentes e assim por diante, torna-se consultável. Essa API é gerada automaticamente pelo sistema de construção do Gatsby, apenas precisamos aprender como usá-la a nosso favor.Se olharmos a guiaExplorer na interface do GraphiQL, veremos as principais consultas da nossa API. Vamos executar uma consulta simples para ver como é o nosso conteúdo atual. A consulta que executaremos é:
1 query MyQuery { 2 allSitePage { 3 totalCount 4 } 5 }
A execução desta consulta retornará o número total de páginas que nosso site possui atualmente, que é 5.
Podemos adicionar a esta consulta para retornar o caminho de todas as páginas. Esta query ficará assim:
1 query MyQuery { 2 allSitePage { 3 totalCount 4 nodes { 5 path 6 } 7 } 8 }
E o resultado:
O melhor do GraphQL e do GraphyQL é que é muito fácil criar queries poderosas. Você pode usar o explorador para ver quais campos pode recuperar. Abordar todos os detalhes do GraphQL está fora do escopo deste artigo, mas se você estiver interessado em saber mais sobre o GraphQL, confira este curso intensivo que fará com que você escreva queries profissionais rapidamente.
Agora que temos nosso aplicativo configurado, vamos começar a criar nosso aplicativo.
Um blog não é muito útil sem conteúdo. O nosso blog analisa livros. Então, a primeira coisa que vamos fazer é conseguir alguns livros para revisar. Novos livros são constantemente lançados, então não acha que seria sensato tentar manter o controle de nossos livros em nosso site GatsbyJS. Um banco de dados como o MongoDB, por outro lado, faz sentido. Hakan Özler tem uma lista organizada de conjuntos de dados para o MongoDB e um deles por acaso é uma lista de 400+ livros. Vamos usar este conjunto de dados.
Importarei o conjunto de dados para o meu banco de dados que reside no MongoDB Atlas. Se você ainda não tiver o MongoDB instalado, poderá obter uma conta gratuita no MongoDB Atlas.
No meu MongoDB Atlas cluster, criará um novo MongoDB database e o chamará de
gatsby
. Neste novo MongoDB database, criarei uma collection chamada books
. Há muitas maneiras diferentes de importar dados para seu MongoDB database, mas como estou usando o MongoDB Atlas, os importarei diretamente por meio da interface da web com o usuário.Nosso conjunto de dados de amostra contém 431 livros, portanto, após a importação, devemos ver 431 documentos na collection de livros.
Agora que temos nossos dados, vamos usá-los em nosso aplicativo GatsbyJS. Para usar o MongoDB como fonte de dados para nosso aplicativo, precisaremos instalar o plug-in
gatsby-source-mongodb
. Para isso, execute1 npm install --save gatsby-source-mongodb
na janela do Terminal. Com o plugin instalado, o próximo passo será configurá-lo. Abra o arquivo
gatsby-config.js
. Este arquivo contém os metadados do nosso site, bem como as opções de configuração do plugin. Na array plugins
, vamos adicionar o plug-ingatsby-source-mongodb
. Ele será parecido com isto:1 { 2 // The name of the plugin 3 resolve: 'gatsby-source-mongodb', 4 options: { 5 // Name of the database and collection where are books reside 6 dbName: 'gatsby', 7 collection: 'books', 8 server: { 9 address: 'main-shard-00-01-zxsxp.mongodb.net', 10 port: 27017 11 }, 12 auth: { 13 user: 'ado', 14 password: 'password' 15 }, 16 extraParams: { 17 replicaSet: 'Main-shard-0', 18 ssl: true, 19 authSource: 'admin', 20 retryWrites: true 21 } 22 } 23 },
Salve o arquivo. Se os seus
dbName
e collection
forem diferentes dos acima, anote-os, pois o nome aqui é muito importante e determinará como você interage com a API do GraphQL.Se o seu site GatsbyJS ainda estiver em execução, pare-o, execute
gatsby clean
e depois gatsby develop
para reiniciar o servidor. O comandogatsby clean
limpará o cache e excluirá a versão anterior. Na minha experiência, é recomendável executar isso, caso contrário, você pode ter problemas com o servidor sendo reiniciado corretamente.Quando o
gatsby develop
comando for executado novamente com sucesso, navegue até a interface do GraphiQL e você verá duas novas consultas disponíveis: mongodbGatsbyBooks
e allMongodbGatsbyBooks
. Observe que, se você nomeou seu banco de dados e sua coleção com algo diferente, esses nomes de consulta serão diferentes. No entanto, a convenção que eles seguirão será mongodb<Your-Database-Name><Your-CollectionName>
e allMongodb<Your-Database-Name><Your-CollectionName>
.Vamos jogar com uma dessas queries e ver a quais dados temos acesso. Execute a seguinte consulta no GraphiQL:
1 query MyQuery { 2 allMongodbGatsbyBooks { 3 edges { 4 node { 5 title 6 } 7 } 8 } 9 }
Seu resultado ficará assim:
Excelente. Nosso plugin foi configurado com sucesso e vemos nossa collection em nosso site GatsbyJS. Podemos adicionar essa consulta solicitando parâmetros adicionais, como autores, categorias, descrição e assim por diante, mas em vez de fazer isso aqui, por que não a renderizamos em nosso site?
Queremos exibir o catálogo de livros em nossa página inicial. Vamos abrir a página
index.js
localizada no diretóriosrc/pages
. Esse componente React representa nossa página inicial. Vamos limpá-lo um pouco antes de começarmos a adicionar outros estilos. Nosso novo componente básico terá a seguinte aparência:1 import React from "react" 2 import { Link } from "gatsby" 3 4 import Layout from "../components/layout" 5 6 const IndexPage = () => ( 7 <Layout> 8 <div className="book-container"> 9 10 </div> 11 </Layout> 12 ) 13 14 export default IndexPage
Em seguida, vamos adicionar uma query GraphQL para obter os dados dos nossos livros nessa página. O código atualizado ficará assim:
1 import React from "react" 2 import { Link } from "gatsby" 3 import { graphql } from "gatsby" 4 5 import Layout from "../components/layout" 6 7 const IndexPage = () => ( 8 <Layout> 9 <div className="book-container"> 10 11 </div> 12 </Layout> 13 ) 14 15 export default IndexPage 16 17 export const pageQuery = graphql` 18 query { 19 allMongodbGatsbyBooks { 20 edges { 21 node { 22 id 23 title 24 shortDescription 25 thumbnailUrl 26 } 27 } 28 } 29 } 30 `
Estamos fazendo uma chamada para a consulta
allMongodbGatsbyBooks
e solicitando todos os livros da collection. Para cada livro, queremos obter seu ID, título, shortDescription e thumbnailUrl. Por fim, para obter esses dados em nosso componente, nós os passaremos por props:1 import React from "react" 2 import { Link } from "gatsby" 3 import { graphql } from "gatsby" 4 5 import Layout from "../components/layout" 6 7 const IndexPage = (props) => { 8 const books = props.data.allMongodbGatsbyBooks.edges; 9 10 return ( 11 <Layout> 12 <div className="book-container"> 13 14 </div> 15 16 </Layout> 17 ) 18 } 19 20 export default IndexPage 21 22 export const pageQuery = graphql` 23 query { 24 allMongodbGatsbyBooks { 25 edges { 26 node { 27 id 28 title 29 shortDescription 30 thumbnailUrl 31 } 32 } 33 } 34 } 35 `
Agora podemos renderizar nossos livros na página. Faremos isso iterando a array de livros e exibindo todas as informações solicitadas. Nosso código será mais ou menos assim:
1 return ( 2 <Layout> 3 <div className="book-container"> 4 {books.map(book => 5 <div className="book"> 6 <Link to={'/book/' + book.node.id}> 7 <img src={book.node.thumbnailUrl} /> 8 <h2>{book.node.title}</h2> 9 <p>{book.node.shortDescription}</p> 10 </Link> 11 </div> 12 )} 13 </div> 14 </Layout> 15 )
Vamos até
localhost:8000
e ver como nosso website está agora. Deve ser semelhante a:Se você começar a rolar, notará que todos os 400+ livros foram renderizados na página. Todos esses dados foram armazenados em cache, portanto, serão carregados muito rapidamente. Mas se clicarmos em qualquer um dos links, obteremos um 404. Isso não é bom, mas há uma boa razão para isso. Não criamos uma visualização individual para os livros. Faremos isso em breve. O outro problema que você deve ter notado é que adicionamos as classes
book-container
e book
, mas elas não parecem ter aplicado nenhum tipo de estilo. Vamos corrigir esse problema primeiro.Abra o arquivo
layout.css
localizado no diretóriosrc/components
e adicione os seguintes estilos à parte inferior da página:1 .book-container { 2 display: flex; 3 flex-direction: row; 4 flex-wrap: wrap 5 } 6 7 .book { 8 width: 25%; 9 flex-grow: 1; 10 text-align: center; 11 } 12 13 .book img { 14 width: 50%; 15 }
Em seguida, vamos simplificar nossa interface do usuário exibindo apenas a capa do livro. Se o usuário quiser saber mais sobre o livro, poderá clicar nele. Atualize o retorno
index.js
para o seguinte:1 const IndexPage = (props) => { 2 const books = props.data.allMongodbGatsbyBooks.edges; 3 4 return ( 5 <Layout> 6 7 <div className="book-container"> 8 {books.map(book => 9 <div className="book"> 10 {book.node.thumbnailUrl && 11 <Link to={'/book/' + book.node.id}> 12 <img src={book.node.thumbnailUrl}/> 13 </Link> 14 } 15 </div> 16 )} 17 </div> 18 19 </Layout> 20 ) 21 }
Já que estamos nisso, vamos alterar o nome do nosso site no cabeçalho para Apps Plus editando o arquivo
gatsby-config.js
. Atualize a propriedadesiteMetadata.title
para Books Plus.Nossa IU atualizada ficará assim:
Como mencionado anteriormente, se você clicar em qualquer uma das capas de livros, será levado a uma página 404 . O GatsbyJS nos oferece várias maneiras de lidar com como queremos criar esta página. Podemos obter esse conteúdo dinamicamente, mas acho que a pré-renderização de todas essas páginas no momento da compilação proporcionará aos nossos usuários uma experiência muito melhor, portanto, faremos isso.
A primeira coisa que precisaremos fazer é criar a interface do usuário para definir como será a aparência da nossa página única de visualização de livro. Crie um novo arquivo no diretório de componentes e chame-o
book.js
. O código deste arquivo ficará assim:1 import React from "react" 2 import { graphql } from "gatsby" 3 import Layout from "./layout" 4 5 class Item extends React.Component { 6 render() { 7 const book = this.props.data.mongodbGatsbyBooks 8 9 return ( 10 <Layout> 11 <div> 12 <img src={book.thumbnailUrl} /> 13 <h1>{book.title}</h1> 14 <p>By {book.authors.map(author => ( <span>{author}, </span>))}</p> 15 <p>{book.longDescription}</p> 16 <p>Published: {book.publishedDate} | ISBN: {book.isbn}</p> 17 {book.categories.map(category => category)} 18 </div> 19 </Layout> 20 ) 21 } 22 } 23 24 export default Item 25 26 export const pageQuery = graphql` 27 query($id: String!) { 28 mongodbGatsbyBooks(id: { eq: $id }) { 29 id 30 title 31 longDescription 32 thumbnailUrl 33 isbn 34 pageCount 35 publishedDate(formatString: "MMMM DD, YYYY") 36 authors 37 categories 38 } 39 } 40 `
Para detalhar o que está acontecendo nesse componente, estamos usando a consulta
mongodbGatsbyBooks
que retorna as informações solicitadas em um único livro com base noid
fornecido. Isso é o suficiente para a implementação do nosso componente. Agora vamos para a parte divertida.Essencialmente, o que queremos que aconteça quando iniciarmos o servidor Gatsby é obter todas as informações sobre os livros do nosso MongoDB database e criar uma página local para cada documento. Para fazer isso, vamos abrir o arquivo
gatsby-node.js
. Adicione o seguinte código, que explicarei a seguir:1 const path = require('path') 2 3 exports.createPages = async ({ graphql, actions }) => { 4 const { createPage } = actions 5 6 const { data } = await graphql(` 7 { 8 books: allMongodbGatsbyBooks { 9 edges { 10 node { 11 id 12 } 13 } 14 } 15 } 16 `) 17 18 const pageTemplate = path.resolve('./src/components/book.js') 19 20 for (const { node } of data.books.edges) { 21 createPage({ 22 path: '/book/${node.id}/', 23 component: pageTemplate, 24 context: { 25 id: node.id, 26 }, 27 }) 28 } 29 }
O código acima fará o trabalho pesado de percorrer nossa lista de 400+ livros e criar uma página estática para cada um. Ele faz isso utilizando a API Gatsby
createPages
. Fornecemos as páginas que queremos, juntamente com o componente React a ser usado, bem como o caminho e o contexto de cada um, e o GatsbyJS faz o resto. Vamos salvar este arquivo, executargatsby clean
e gatsby develop
e navegar até localhost:8000
.Agora, quando a página carregar, você poderá clicar em qualquer um dos livros e, em vez de ver um 404, verá os detalhes do livro renderizado no URL
/book/{id}
.Até agora tudo bem!
Mostramos como podemos usar o MongoDB como fonte de dados para nossos livros. A próxima etapa será permitir que escrevamos resenhas sobre esses livros e, para isso, usaremos uma fonte de dados diferente: o velho e confiável Markdown.
No diretório
src
, crie um novo diretório e chame-o content
. Neste diretório, vamos criar nosso primeiro post chamado welcome.md
. Abra o novo arquivowelcome.md
e cole a seguinte marcação:1 --- 2 title: Welcome to Books Plus 3 author: Ado Kukic 4 slug: welcome 5 --- 6 7 Welcome to BooksPlus, your trusted source of tech book reviews!
Salve este arquivo. Para usar arquivos Markdown como nossa fonte de conteúdo, teremos que adicionar outro plugin. Esse plug-in será usado para transformar nossos
.md
arquivos em conteúdo digerível para nossa API GraphQL e, por fim, para nosso frontend. Esse plugin se chama gatsby-transformer-remark
e você pode instalá-lo executando npm install --save gatsby-transformer-remark
.Teremos que configurar esse plugin em nosso arquivo
gatsby-config.js
. Abra-o e faça as seguintes alterações:1 { 2 resolve: 'gatsby-source-filesystem', 3 options: { 4 name: 'content', 5 path: `${__dirname}/src/content/`, 6 }, 7 }, 8 'gatsby-transformer-remark',
O -in
gatsby-source-filesystem
plugin já está instalado e o substituiremos para nos concentrarmos apenas em nossos arquivos de marcação. Abaixo, adicionaremos nosso novo -in plugin para transformar nosso Markdown em um formato com o qual nossa poderá GraphQL API funcionar. Enquanto estivermos nisso, também podemos remover os componentes iniciais e , pois image.js
seo.js
não os usaremos em nosso aplicativo.Vamos reiniciar nosso servidor Gatsby e navegar até a interface do usuário do GraphyQL. Veremos duas novas queries adicionadas:
allMarkdownRemark
e markdownRemark
. Essas queries nos permitirão consultar nosso conteúdo de marcação. Vamos executar a seguinte query:1 query MyQuery { 2 allMarkdownRemark { 3 edges { 4 node { 5 frontmatter { 6 title 7 author 8 } 9 html 10 } 11 } 12 } 13 }
Nosso resultado deve ser parecido com a captura de tela abaixo e será exatamente igual ao arquivo markdown que criamos anteriormente.
Agora que podemos consultar nosso conteúdo de marcação, podemos pré-gerar as páginas de marcação para nosso blog. Vamos fazer isso a seguir. A primeira coisa de que precisaremos é de um modelo para o nosso blog. Para criá-lo, crie um novo arquivo chamado
blog.js
localizado no diretóriosrc/components
. Meu código ficará assim:1 import React from "react" 2 import { graphql } from "gatsby" 3 import Layout from "./layout" 4 5 class Blog extends React.Component { 6 render() { 7 const post = this.props.data.markdownRemark 8 9 return ( 10 <Layout> 11 <div> 12 <h1>{post.frontmatter.title}</h1> 13 <h2>By {post.frontmatter.author}</h2> 14 <div 15 className="blog-post-content" 16 dangerouslySetInnerHTML={{ __html: post.html }} 17 /> 18 </div> 19 </Layout> 20 ) 21 } 22 } 23 24 export default Blog 25 26 export const pageQuery = graphql` 27 query($id: String!) { 28 markdownRemark(frontmatter : {slug: { eq: $id }}) { 29 frontmatter { 30 title 31 author 32 } 33 html 34 } 35 } 36 `
Em seguida, precisaremos dizer ao Gatsby para criar nossas páginas de markdown no momento da criação. Abriremos o arquivo
gatsby-node.js
e faremos as seguintes alterações:1 const path = require('path') 2 3 exports.createPages = async ({ graphql, actions }) => { 4 const { createPage } = actions 5 6 const { data } = await graphql(` 7 { 8 books: allMongodbGatsbyBooks { 9 edges { 10 node { 11 id 12 } 13 } 14 } 15 posts: allMarkdownRemark { 16 edges { 17 node { 18 frontmatter { 19 slug 20 } 21 } 22 } 23 } 24 } 25 `) 26 27 const blogTemplate = path.resolve('./src/components/blog.js') 28 const pageTemplate = path.resolve('./src/components/book.js') 29 30 for (const { node } of data.posts.edges) { 31 32 createPage({ 33 path: `/blog/${node.frontmatter.slug}/`, 34 component: blogTemplate, 35 context: { 36 id: node.frontmatter.slug 37 }, 38 }) 39 } 40 41 for (const { node } of data.books.edges) { 42 createPage({ 43 path: `/book/${node.id}/`, 44 component: pageTemplate, 45 context: { 46 id: node.id, 47 }, 48 }) 49 } 50 }
As alterações que fizemos acima não apenas gerarão uma página diferente para cada livro, mas agora gerarão uma página exclusiva para cada arquivo markdown. Em vez de usar um ID gerado aleatoriamente para a página de conteúdo, usaremos o slug definido pelo usuário no frontmatter.
Vamos reiniciar nosso servidor Gatsby e navegar até
localhost:8000/blog/welcome
para ver nossas alterações em ação.Queremos que nossos usuários possam ler nosso conteúdo e avaliações. Atualmente, você pode navegar até
/blog/welcome
para ver a postagem, mas também seria bom exibir nossas postagens mais recentes do blog na página inicial. Para fazer isso, vamos fazer algumas atualizações em nosso arquivoindex.js
. Faremos as seguintes alterações:1 import React from "react" 2 import { Link } from "gatsby" 3 import { graphql } from "gatsby" 4 5 import Layout from "../components/layout" 6 7 const IndexPage = (props) => { 8 const books = props.data.books.edges; 9 const posts = props.data.posts.edges; 10 11 return ( 12 <Layout> 13 <div className="posts"> 14 {posts.map(post => 15 <div className="post"> 16 <h2><Link to={"/blog/" + post.node.frontmatter.slug}>{post.node.frontmatter.title}</Link></h2> 17 <p>By {post.node.frontmatter.author}</p> 18 </div>)} 19 </div> 20 <div className="book-container"> 21 {books.map(book => 22 <div className="book"> 23 {book.node.thumbnailUrl && 24 <Link to={'/book/' + book.node.id}> 25 <img src={book.node.thumbnailUrl}/> 26 </Link> 27 } 28 </div> 29 )} 30 </div> 31 32 </Layout> 33 ) 34 } 35 36 export default IndexPage 37 38 export const pageQuery = graphql` 39 query { 40 posts: allMarkdownRemark { 41 edges { 42 node { 43 frontmatter { 44 title 45 slug 46 author 47 } 48 } 49 } 50 } 51 books: allMongodbGatsbyBooks { 52 edges { 53 node { 54 id 55 title 56 shortDescription 57 thumbnailUrl 58 } 59 } 60 } 61 } 62 `
Atualizamos nossa consulta GraphQL para obter não apenas a lista de livros, mas também todas as nossas postagens. Nomeamos essas consultas como
books
e posts
, para que seja mais fácil trabalhar com elas em nosso modelo. Por fim, atualizamos o modelo para renderizar a nova interface do usuário. Se você navegar até localhost:8000
agora, verá a última postagem no topo, assim:E, é claro, você pode clicar nele para ver a única postagem do blog.
A última coisa que gostaria de fazer em nosso blog hoje é a capacidade de referenciar um livro do MongoDB em nossa análise. Dessa forma, quando um usuário lê uma resenha, ele pode clicar facilmente e ver as informações do livro.
Para começar, precisaremos atualizar nosso arquivo
gatsby-node.js
para nos permitir executar query de um livro específico fornecido no frontmatter de uma publicação. Atualizaremos o allMarkdownRemark
para que, além de obter o slug, obtenhamos o parâmetro do livro. A query ficará assim:1 allMarkdownRemark { 2 edges { 3 node { 4 frontmatter { 5 slug 6 book 7 } 8 } 9 } 10 } 11 ... 12 }
Além disso, precisaremos atualizar nosso método
createPage()
ao gerar as páginas do blog para passar as informações do livro no contexto.1 createPage({ 2 path: `/blog/${node.frontmatter.slug}/`, 3 component: blogTemplate, 4 context: { 5 id: node.frontmatter.slug, 6 book: node.frontmatter.book 7 }, 8 }) 9 }
Poderemos usar qualquer coisa passada nesta propriedade
context
em nossas queries do GraphQL em nosso componente de blog.Em seguida, atualizaremos nosso componente de blog para levar em conta a nova query. Essa query será a query do livro baseado no MongoDB. Terá a seguinte aparência:
1 export const pageQuery = graphql` 2 query($id: String!, $book: String) { 3 post: markdownRemark(frontmatter : {slug: { eq: $id }}) { 4 id 5 frontmatter { 6 title 7 author 8 } 9 html 10 } 11 book: mongodbGatsbyBooks(id: { eq: $book }) { 12 id 13 thumbnailUrl 14 } 15 } 16 `
Observe que o parâmetro
$book
é opcional. Isso significa que uma postagem pode ser associada a um livro específico, mas não precisa ser. Atualizaremos nossa interface do usuário para exibir as informações do livro se um livro for fornecido.1 class Blog extends React.Component { 2 render() { 3 const post = this.props.data.post 4 const book = this.props.data.book 5 6 return ( 7 <Layout> 8 <div> 9 <h1>{post.frontmatter.title}</h1> 10 <h2>By {post.frontmatter.author}</h2> 11 <div 12 className="blog-post-content" 13 dangerouslySetInnerHTML={{ __html: post.html }} 14 /> 15 16 {book && 17 <Link to={"/book/" + book.id}> 18 <img src={book.thumbnailUrl} /> 19 </Link> 20 } 21 </div> 22 </Layout> 23 ) 24 } 25 }
Se olharmos para nossa postagem original, ela não tem um livro associado a ela, portanto, essa postagem específica não deve parecer diferente. Mas vamos escrever um novo conteúdo que contenha uma resenha de um livro específico. Crie um novo arquivo markdown chamado
mongodb-in-action-review.md
. Adicionaremos a seguinte resenha:1 --- 2 title: MongoDB In Action Book Review 3 author: Ado Kukic 4 slug: mdb-in-action-review 5 book: 30e4050a-da76-5c08-a52c-725b4410e69b 6 --- 7 8 MongoDB in Action is an essential read for anybody wishing to learn the ins and outs of MongoDB. Although the book has been out for quite some time, it still has a lot of valuable information and is a great start to learning MongoDB.
Reinicie seu servidor Gatsby para que o novo conteúdo possa ser gerado. Em sua página inicial, agora você verá duas publicações no blog, a publicação original de Boas -vindas e a nova publicação do MongoDB In Action Review.
Ao clicar no linkMongoDB In Action Review, você será levado a uma página do blog que contém a resenha que escrevemos há alguns segundos. Mas agora, você também verá a miniatura do livro. Clicar nessa miniatura o levará à página do livro, onde você poderá saber mais sobre ele.
Neste tutorial, mostrei como construir um blog moderno com GatsbyJS. Usamos várias fontes de dados, incluindo um banco de dadosMongoDB Atlasremoto e arquivos de marcação local, para gerar um blog estático. Fizemos um breve tour pelo GraphQL e como ele aprimora nossa experiência de desenvolvimento, consolidando todas as nossas fontes de dados em uma única API que podemos consultar no momento da criação e da execução. espero que você tenha aprender algo novo, se tiver alguma dúvida, fique à vontade para perguntar em nossos MongoDB Community.
Se quiser obter o código deste tutorial, você pode cloná-lo a partir deste Github. O conjunto de dados de livros de amostra também pode ser encontrado aqui. Experimente oMongoDB Atlas para facilitar o gerenciamento e o dimensionamento do seu MongoDB database.
Boa codificação!