Overview
このチュートリアルでは、 MongoDBに接続する Next.jsアプリケーションを作成する方法を学びます。また、Next.js アプリケーションをホストするプラットフォームである Vercel にアプリケーションを配置する方法も学びます。
注意
このチュートリアルでは、Next.js がバージョン 13 で導入したアプリ ルーターではなく、Next.js ページ ルーターを使用します。
前提条件
始める前に、以下の手順を完了してください。
MongoDB の使用開始ガイドを完了して、新しい Atlas アカウントを設定し、サンプルデータを新しい無料階層の MongoDB 配置にロードします。
クラスターの接続文字列を取得し、このチュートリアルの後半で使用するために保存します。
Vercel のウェブサイトにアクセスして Vercel アカウントを作成します。
Tutorial
このチュートリアルでは、次の手順についてガイドします。
Next.jsアプリケーション の作成。
MongoDB をNext.js に接続します。
Next.js からMongoDBをクエリします。
Vercel にアプリケーションを配置します。
Next.js アプリケーションの作成
mongodb例テンプレートを使用して、 MongoDB統合で Next.jsアプリケーションを作成できます。
MongoDB統合で新しい Next.jsアプリケーションを作成するには、ターミナルで次のコマンドを実行します。
npx create-next-app --example with-mongodb sample_mflix
コマンドは、npx create-next-app と --example with-mongodb パラメータを使用して、 MongoDB統合の例からアプリケーションを作成します。sample_mflix は、アプリケーションの名前です。必要に応じて、別の名前を使用してください。
コマンドが完了したら、次のコマンドを実行中てプロジェクトディレクトリに移動します。
cd sample_mflix
次のコマンドを実行中してnpm依存関係をインストールします。
npm install
Next.jsアプリケーション を起動するには、次のコマンドを実行します。
npm run dev
アプリケーションのビルド後に、ブラウザで localhost:3000 に移動します。ページには、 MongoDB接続文字列をまだ指定していないため、エラー メッセージが表示されます。
MongoDB をNext.js に接続する
Next.jsアプリケーションディレクトリには env.local.exampleファイルが含まれています。このファイルの名前を env.local に変更して開きます。ファイルには 1 つのプロパティが含まれています: MONGODB_URI。
MongoDB接続文字列をMONGODB_URIプロパティの値として設定します。env.localファイルは次の例のようになります。
MONGODB_URI=<Your connection string>
構成を確認するには、ターミナルで次のコマンドを実行中て Next.jsアプリケーションを再起動します。
npm run dev
アプリケーションがビルドされたら、ブラウザで localhost:3000 に移動します。MongoDB Next.jsアプリケーションのようこそページが表示されます。
Tip
「MongoDBに接続されています」というメッセージが表示されたら、接続は成功します。「MongoDBに接続していません」というメッセージが表示された場合は、接続文字列を確認し、データベースユーザーとネットワーク接続が正しく構成されていることを確認してください。
Next.js からのクエリMongoDB
Next.js は、データを検索するための複数の方法をサポートしています。APIエンドポイントとなる接続されたデバイスを作成したり、ページに対してサーバー側のレンダリングされた関数を実行したり、ビルド時にデータを取得して静的ページを生成したりできます。このチュートリアルでは、3 つの方法すべての例を示します。
例 1: MongoDB用の Next.js APIエンドポイントの作成
新しいAPIエンドポイント ルートを作成するには、 pagesディレクトリに apiディレクトリを作成します。apiディレクトリで作成する各ファイルは、個別のAPIエンドポイントになります。
apiディレクトリに movies.tsx という新しいファイルを作成します。このエンドポイントとなる接続されたデバイスは、 MongoDBデータベースから映画のリストを返します。次のコードを 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 }
上記のコードでは、sample_mflixデータベースから metacritic 評価の降順でソートされた上位 10 映画を返すAPIエンドポイントが作成されます。res.json メソッドは、映画の配列をJSON形式でブラウザに提供します。localhost:3000/api/movies に移動すると、ブラウザにはデータベースから返された映画のリストが表示されます。
apiディレクトリに追加のファイルを作成して、さらにAPIルートを追加します。
例 2: MongoDBを使用した Next.js ページ
getServerSideProps() メソッドを使用して、Next.js ページにデータを直接取得できます。このメソッドは、Next.js ページを使用する場合に利用できます。
getServerSideProps() メソッドは、Next.js ページがサーバー側のレンダリングを使用して読み込むように強制します。ページが読み込まれるたびに、 getServerSideProps() メソッドはバックエンドで実行され、データを取得し、 props を通じてReactコンポーネントに送信されます。getServerSideProps() 内のコードはクライアントに送信されません。
pagesディレクトリに movies.tsx という新しいファイルを作成します。次のコードは、getServerSideProps() を使用して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 };
Moviesページ コンポーネントは getServerSideProps() メソッドから props を受け取り、そのデータを使用してページをレンダーします。ページには、上位映画のタイトル、メタファー評価、プロットが表示されます。
注意
ページが呼び出されるたびに getServerSideProps() メソッドが実行されます。データが頻繁に変更されない場合は、代わりに静的ページ生成を使用してください。
例 3: MongoDBを使用した Next.js の静的生成
静的ページ生成を使用して、ビルド時にページを事前にレンダリングできます。この方法は、データが頻繁に変更されない場合に便利です。
pagesディレクトリに top.tsx という新しいファイルを作成します。次のコードは、getStaticProps() を使用して、MongoDBデータベースから 100 万の最高評価の映画をレンダーする方法を示しています。
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 };
localhost:3000/top に移動すると、ブラウザに映画のリストが表示されます。
開発モードでは、アプリケーションはgetServerSideProps() メソッドと同様に、毎回 getStaticProps() メソッドを呼び出します。本番モードでは、/top ページが事前レンダリングされ、ほぼすぐに読み込まれます。
Next.jsアプリケーションを本番モードで実行するには、まずビルドします。次に、start コマンドを実行して、ビルドされたアプリケーションを提供します。ターミナルで次のコマンドを実行します。
npm run build npm run start
npm run start コマンドを実行すると、Next.js はアプリケーションを本番モードで提供します。Next.js はページを静的に処理するため、getStaticProps() メソッドは /top ルートにアクセスするたびに実行されるわけではありません。事前レンダリングされた静的ページを確認するには、 .next/server/pages/top.htmlファイルを表示します。
Vercel にアプリケーションを配置する
Vercel 上のMongoDBを使用して Next.jsアプリケーションを配置します。配置する前に、前述の手順のアプリケーションコードを GitHubリポジトリにコミットする必要があります。Githubアカウントの作成 とリポジトリにコミットする 方法については、 GitHub ドキュメントを参照してください。
コードをリポジトリにコミットした後、Vercel に移動してログます。Vercel ダッシュボードで、Import Project(プロジェクトのインポート) ボタンをクリックし、Git リポジトリのインポート をクリックします。
GitHubリポジトリURLを入力し、Continue(続行) をクリックします。次の画面で、env.localファイルから変数を追加します。
[ 配置 ] ボタンをクリックします。Vercel は Next.jsアプリケーションを自動的にビルドして配置します。完了すると、アプリケーションにアクセスできるURLが返されます。
注意
Vercel は動的IPアドレスを使用するため、 MongoDB Atlasダッシュボード内の任意のIPアドレスからデータにアクセスするには、例外を追加する必要があります。これを行うには、[ ネットワーク アクセス ]タブに移動し、Add IP Address ボタンをクリックしてから、任意の場所からのアクセスを許可 ボタンをクリックします。
追加リソース
このチュートリアルの概念の詳細については、次のリソースを参照してください。