Visão geral
Neste tutorial, você aprenderá como criar um aplicativo Next.js que se conecta ao MongoDB. Você também aprenderá como implantar o aplicativo no Vercel, uma plataforma que hospeda aplicativos Next.js.
Observação
Este tutorial utiliza o roteador de páginas Next.js em vez do roteador de aplicativo que o Next.js introduziu na versão 13.
Pré-requisitos
Antes de começar, conclua as seguintes etapas:
Complete o guia Iniciar MongoDB para configurar uma nova conta Atlas e carregar dados de amostra em uma nova implantação MongoDB de camada grátis.
Obtenha a string de conexão para seu cluster e salve-a para uso posterior neste tutorial.
Crie uma conta do Vercel acessando o website do Vercel.
Baixe o Node.js versão 18 ou posterior.
Certifique-se de ter o npm e o npx instalados.
Tutorial
Este tutorial orienta você nas seguintes etapas:
Criar um aplicativo Next.js.
Conecte o MongoDB ao Next.js.
Consulte o MongoDB do Next.js.
Implante seu aplicativo no Vercel.
Criar um aplicativo Next.js
Você pode criar um aplicativo Next.js com integração MongoDB usando o modelo de exemplo with-mongodb.
Para criar um novo aplicativo Next.js com integração MongoDB, execute o seguinte comando no seu terminal:
npx create-next-app --example with-mongodb sample_mflix
O comando utiliza npx create-next-app e o parâmetro --example with-mongodb para criar um aplicativo a partir do exemplo de integração MongoDB . sample_mflix é o nome do aplicativo. Use um nome diferente, se preferir.
Após a conclusão do comando, navegue até o diretório do projeto executando o seguinte comando:
cd sample_mflix
Instale as dependências npm executando o seguinte comando:
npm install
Para iniciar seu aplicativo Next.js, execute o seguinte comando:
npm run dev
Após a compilação do aplicativo, navegue até localhost:3000 em seu navegador. A página exibe uma mensagem de erro porque você ainda não forneceu sua string de conexão do MongoDB.
Conecte o MongoDB ao Next.js
O diretório de aplicativo Next.js contém um arquivo env.local.example. Renomeie este arquivo para env.local e abra-o. O arquivo contém uma propriedade: MONGODB_URI.
Configure sua string de conexão do MongoDB como o valor da propriedade MONGODB_URI. Seu arquivo env.local é semelhante ao exemplo a seguir:
MONGODB_URI=<Your connection string>
Para verificar a configuração, reinicie o aplicativo Next.js executando o seguinte comando no terminal:
npm run dev
Quando o aplicativo for compilado, navegue até localhost:3000 em seu navegador. Você vê a página de boas-vindas do aplicativo with-mongodb Next.js.
Dica
Sua conexão é bem-sucedida se você vir a mensagem "Você está conectado ao MongoDB". Se você vir a mensagem "Você NÃO está conectado ao MongoDB", verifique sua string de conexão e certifique-se de que o usuário de banco de dados e a conexão de rede estejam configurados corretamente.
Consultar o MongoDB do Next.js
Next.js oferece suporte a várias maneiras de recuperar dados. Você pode criar pontos de extremidade de API, executar funções renderizadas do lado do servidor para uma página ou gerar páginas estáticas obtendo dados no tempo de compilação. Este tutorial mostra exemplos de todos os três métodos.
Exemplo 1: criar um ponto de extremidade da API Next.js para MongoDB
Para criar uma nova rota de ponto de extremidade da API, crie um diretório api no seu diretório pages. Cada arquivo criado no diretório api se torna um ponto de extremidade de API individual.
Crie um novo arquivo no diretório api denominado movies.tsx. Este ponto de extremidade retorna uma lista de filmes do seu banco de dados MongoDB . Adicione o seguinte código ao arquivo movies.tsx:
1 import clientPromise from "../../lib/mongodb"; 2 import { NextApiRequest, NextApiResponse } from 'next'; 3 4 export default async (req: NextApiRequest, res: NextApiResponse) => { 5 try { 6 const client = await clientPromise; 7 const db = client.db("sample_mflix"); 8 const movies = await db 9 .collection("movies") 10 .find({}) 11 .sort({ metacritic: -1 }) 12 .limit(10) 13 .toArray(); 14 res.json(movies); 15 } catch (e) { 16 console.error(e); 17 } 18 }
O código anterior cria um ponto de extremidade de API que retorna os 10 principais filmes do banco de dados sample_mflix classificados por sua classificação metacritic em ordem decrescente. O método res.json serve a array de filmes no formato JSON para o navegador. Quando você navega até localhost:3000/api/movies, o navegador exibe uma lista de filmes retornados do seu banco de dados.
Adicione mais rotas API criando arquivos adicionais no diretório api.
Exemplo 2: páginas Next.js com MongoDB
Você pode obter dados diretamente em suas páginas Next.js usando o método getServerSideProps(). Este método está disponível quando você usa páginas Next.js.
O método getServerSideProps() força uma página Next.js a usar a renderização do lado do servidor para carregar. Toda vez que a página carrega, o método getServerSideProps() executa no backend, obtém dados e os envia para o componente React por meio de acessórios. O código dentro de getServerSideProps() nunca é enviado ao cliente.
Crie um novo arquivo no diretório pages denominado movies.tsx. O seguinte código mostra como utilizar o getServerSideProps() para query MongoDB:
1 import clientPromise from "../lib/mongodb"; 2 import { GetServerSideProps } from 'next'; 3 4 interface Movie { 5 _id: string; 6 title: string; 7 metacritic: number; 8 plot: string; 9 } 10 11 interface MoviesProps { 12 movies: Movie[]; 13 } 14 15 const Movies: React.FC<MoviesProps> = ({ movies }) => { 16 return ( 17 <div> 18 <h1>Top 20 Movies of All Time</h1> 19 <p> 20 <small>(According to Metacritic)</small> 21 </p> 22 <ul> 23 {movies.map((movie) => ( 24 <li key={movie._id}> 25 <h2>{movie.title}</h2> 26 <h3>{movie.metacritic}</h3> 27 <p>{movie.plot}</p> 28 </li> 29 ))} 30 </ul> 31 </div> 32 ); 33 }; 34 35 export default Movies; 36 37 export const getServerSideProps: GetServerSideProps = async () => { 38 try { 39 const client = await clientPromise; 40 const db = client.db("sample_mflix"); 41 const movies = await db 42 .collection("movies") 43 .find({}) 44 .sort({ metacritic: -1 }) 45 .limit(20) 46 .toArray(); 47 return { 48 props: { movies: JSON.parse(JSON.stringify(movies)) }, 49 }; 50 } catch (e) { 51 console.error(e); 52 return { props: { movies: [] } }; 53 } 54 };
O componente de página Movies recebe os props do método getServerSideProps() e utiliza esses dados para renderizar a página. A página mostra o título do filme principal, classificação metacritic e roteiro.
Observação
O método getServerSideProps() é executado toda vez que a página é chamada. Se seus dados não mudarem com frequência, use a geração de páginas estáticas.
Exemplo 3: geração estática Next.js com MongoDB
Você pode usar a geração de páginas estáticas para pré-renderizar páginas no tempo de criação. Este método é útil quando seus dados não mudam com frequência.
Crie um novo arquivo no diretório pages denominado top.tsx. O código a seguir mostra como usar getStaticProps() para renderizar os mil filmes mais bem avaliados do seu banco de dados MongoDB :
1 import { ObjectId } from "mongodb"; 2 import clientPromise from "../lib/mongodb"; 3 import { GetStaticProps } from "next"; 4 5 interface Movie { 6 _id: ObjectId; 7 title: string; 8 metacritic: number; 9 plot: string; 10 } 11 12 interface TopProps { 13 movies: Movie[]; 14 } 15 16 export default function Top({ movies }: TopProps) { 17 return ( 18 <div> 19 <h1>Top 1000 Movies of All Time</h1> 20 <p> 21 <small>(According to Metacritic)</small> 22 </p> 23 <ul> 24 {movies.map((movie) => ( 25 <li key={movie._id.toString()}> 26 <h2>{movie.title}</h2> 27 <h3>{movie.metacritic}</h3> 28 <p>{movie.plot}</p> 29 </li> 30 ))} 31 </ul> 32 </div> 33 ); 34 } 35 36 export const getStaticProps: GetStaticProps<TopProps> = async () => { 37 try { 38 const client = await clientPromise; 39 40 const db = client.db("sample_mflix"); 41 42 const movies = await db 43 .collection("movies") 44 .find({}) 45 .sort({ metacritic: -1 }) 46 .limit(1000) 47 .toArray(); 48 49 return { 50 props: { movies: JSON.parse(JSON.stringify(movies)) }, 51 }; 52 } catch (e) { 53 console.error(e); 54 return { 55 props: { movies: [] }, 56 }; 57 } 58 };
Quando você navega até localhost:3000/top, o navegador exibe uma lista de filmes.
No modo de desenvolvimento, seu aplicativo chama o método getStaticProps() todas as vezes, semelhante ao método getServerSideProps(). No modo de produção, a página /top pré-renderiza e carrega quase que imediatamente.
Para executar seu aplicativo Next.js no modo de produção, crie-o primeiro. Em seguida, execute o comando start para servir o aplicativo criado. Execute os seguintes comandos no seu terminal:
npm run build npm run start
Quando você executa o comando npm run start, o Next.js serve seu aplicativo no modo de produção. O método getStaticProps() não é executado toda vez que você acessa a rota /top porque Next.js serve a página estaticamente. Para ver a página estática pré-renderizada, visualize o arquivo .next/server/pages/top.html.
Implante seu aplicativo no Vercel
Implante seu aplicativo Next.js com MongoDB no Vercel. Antes de implantar, você deve confirmar o código do aplicativo das etapas anteriores em um repositório do GitHub. Para saber como criar uma conta no Github e confirmar em um repositório, consulte a documentação do GitHub.
Depois de confirmar seu código em um repositório, navegue até Vercel e conectar. No dashboard do Vercel, clique no botão Importar Projeto e, em seguida, clique em Importar Repositório Git.
Insira a URL do repositório do GitHub e clique em Continuar. Na próxima tela, adicione as variáveis do seu arquivo env.local.
Clique no botão Implantar. O Vercel cria e implementa automaticamente seu aplicativo Next.js. Quando ele for concluído, você receberá um URL onde poderá acessar seu aplicativo.
Observação
O Vercel usa endereços IP dinâmicos, portanto, você deve adicionar uma exceção para acessar seus dados a partir de qualquer endereço IP no painel do MongoDB Atlas . Para fazer isso, navegue até a aba Acesso à rede, clique no botão Add IP Address e, em seguida, clique no botão Permitir acesso de qualquer lugar.
Recursos adicionais
Para obter mais informações sobre os conceitos deste tutorial, consulte os seguintes recursos: