Explore o novo chatbot do Developer Center! O MongoDB AI chatbot pode ser acessado na parte superior da sua navegação para responder a todas as suas perguntas sobre o MongoDB .

Junte-se a nós no Amazon Web Services re:Invent 2024! Saiba como usar o MongoDB para casos de uso de AI .
Desenvolvedor do MongoDB
Central de desenvolvedor do MongoDBchevron-right
Idiomaschevron-right
JavaScriptchevron-right

Crie um blog moderno com Gatsby e MongoDB

Ado Kukic16 min read • Published Jan 14, 2022 • Updated Apr 02, 2024
MongoDBJavaScript
Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Tutorial
star-empty
star-empty
star-empty
star-empty
star-empty
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.

Pré-requisitos

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 que estamos construindo: um blog moderno de resenhas de livros

O aplicativo que estamos construindo hoje se chama Books Plus. É um blog que analisa livros técnicos.
Página inicial da Books Plus
Página inicial da Books Plus

Começando com GatsbyJS

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.
Site do Gatsby
Site do Gatsby
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.

Configurando nosso aplicativo

Para criar um site GatsbyJS, precisaremos instalar o Gatsby CLI. Na janela do Terminal, execute npm install -g gatsby-cli.
Gatsby CLI
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:
1gatsby 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.
1gatsby 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.
GatsbyJS Default
GatsbyJS Default
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.

Molho secreto do GatsbyJS: GraphQL

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.
GraphiQL UI
GraphiQL UI
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 é:
1query 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.
Resultados do GraphiQL
Resultados do GraphiQL
Podemos adicionar a esta consulta para retornar o caminho de todas as páginas. Esta query ficará assim:
1query MyQuery {
2 allSitePage {
3 totalCount
4 nodes {
5 path
6 }
7 }
8}
E o resultado:
Resultados do GrafiQL com caminhos
Resultados do GrafiQL com caminhos
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.

Adicionar conteúdo ao nosso blog

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.
MongoDB Atlas
MongoDB Atlas
Nosso conjunto de dados de amostra contém 431 livros, portanto, após a importação, devemos ver 431 documentos na collection de livros.

Conectando MongoDB e GatsbyJS

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-ingatsby-source-mongodb. Para isso, execute
1npm install --save gatsby-source-mongodb
na janela do Terminal. Com o plugin instalado, o próximo passo será configurá-lo. Abra o arquivogatsby-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:
1query MyQuery {
2 allMongodbGatsbyBooks {
3 edges {
4 node {
5 title
6 }
7 }
8 }
9}
Seu resultado ficará assim:
Todos os livros do MongoDB
Todos os livros do MongoDB
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?

Exibindo dados do livro na página inicial

Queremos exibir o catálogo de livros em nossa página inicial. Vamos abrir a página index.jslocalizada 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:
1import React from "react"
2import { Link } from "gatsby"
3
4import Layout from "../components/layout"
5
6const IndexPage = () => (
7 <Layout>
8 <div className="book-container">
9
10 </div>
11 </Layout>
12)
13
14export 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:
1import React from "react"
2import { Link } from "gatsby"
3import { graphql } from "gatsby"
4
5import Layout from "../components/layout"
6
7const IndexPage = () => (
8 <Layout>
9 <div className="book-container">
10
11 </div>
12 </Layout>
13)
14
15export default IndexPage
16
17export 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 consultaallMongodbGatsbyBookse 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:
1import React from "react"
2import { Link } from "gatsby"
3import { graphql } from "gatsby"
4
5import Layout from "../components/layout"
6
7const 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
20export default IndexPage
21
22export 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:
1return (
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:
WIP da página inicial do Books Plus
WIP da página inicial do Books Plus
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 arquivolayout.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 retornoindex.jspara o seguinte:
1const 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 arquivogatsby-config.js. Atualize a propriedadesiteMetadata.title para Books Plus.
Nossa IU atualizada ficará assim:
Books Plus UI com livros
Books Plus UI com livros

Criar a página de informações sobre livros

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:
1import React from "react"
2import { graphql } from "gatsby"
3import Layout from "./layout"
4
5class 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
24export default Item
25
26export 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 mongodbGatsbyBooksque 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 arquivogatsby-node.js. Adicione o seguinte código, que explicarei a seguir:
1const path = require('path')
2
3exports.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 GatsbycreatePages . 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 develope 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} .
Books Plus Página de informações do livro
Books Plus Página de informações do livro
Até agora tudo bem!

Escrevendo avaliações de livros com Markdown

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óriosrc, 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---
2title: Welcome to Books Plus
3author: Ado Kukic
4slug: welcome
5---
6
7Welcome 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 arquivogatsby-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:
1query 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.
Consulta de Markdown do GraphiQL
Consulta de Markdown do GraphiQL

Renderizando o conteúdo do blog

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:
1import React from "react"
2import { graphql } from "gatsby"
3import Layout from "./layout"
4
5class 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
24export default Blog
25
26export 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 arquivogatsby-node.jse faremos as seguintes alterações:
1const path = require('path')
2
3exports.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.
Livros mais postagem
Livros mais postagem

Exibindo publicações na página inicial

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:
1import React from "react"
2import { Link } from "gatsby"
3import { graphql } from "gatsby"
4
5import Layout from "../components/layout"
6
7const 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
36export default IndexPage
37
38export 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:
Livros Plus com conteúdo
Livros Plus com conteúdo
E, é claro, você pode clicar nele para ver a única postagem do blog.

Combinando fontes de dados Mongo e Markdown

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 arquivogatsby-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:
1allMarkdownRemark {
2 edges {
3 node {
4 frontmatter {
5 slug
6 book
7 }
8 }
9 }
10 }
11 ...
12}
Além disso, precisaremos atualizar nosso métodocreatePage() ao gerar as páginas do blog para passar as informações do livro no contexto.
1createPage({
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 propriedadecontext 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:
1export 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.
1class 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---
2title: MongoDB In Action Book Review
3author: Ado Kukic
4slug: mdb-in-action-review
5book: 30e4050a-da76-5c08-a52c-725b4410e69b
6---
7
8MongoDB 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.
Página de revisão com livro
Página de revisão com livro
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.

Juntando tudo

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!

Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Tutorial
star-empty
star-empty
star-empty
star-empty
star-empty
Relacionado
Início rápido

Tutorial de fluxos de alterações e triggers com o Node.js


Aug 24, 2023 | 17 min read
Tutorial

Rastreamento de localização em tempo real com Change Streams e Socket.io


Aug 13, 2024 | 8 min read
exemplo de código

GroupUs


Jul 07, 2022 | 1 min read
Tutorial

Manutenção de uma tabela de classificação de jogos específica de geolocalização com Phaser e MongoDB


Apr 02, 2024 | 18 min read
Sumário