Learn the "why" behind slow queries and how to fix them in our 2-Part Webinar.
Register now >
Docs Menu
Docs Home
/ /

チュートリアル: Vercel で Next.js アプリケーションを配置

このチュートリアルでは、 MongoDBに接続する Next.jsアプリケーションを作成する方法を学びます。また、Next.js アプリケーションをホストするプラットフォームである Vercel にアプリケーションを配置する方法も学びます。

注意

このチュートリアルでは、Next.js がバージョン 13 で導入したアプリ ルーターではなく、Next.js ページ ルーターを使用します。

始める前に、以下の手順を完了してください。

このチュートリアルでは、次の手順についてガイドします。

  • Next.jsアプリケーション の作成。

  • MongoDB をNext.js に接続します。

  • Next.js からMongoDBをクエリします。

  • Vercel にアプリケーションを配置します。

1

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接続文字列をまだ指定していないため、エラー メッセージが表示されます。

2

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に接続していません」というメッセージが表示された場合は、接続文字列を確認し、データベースユーザーとネットワーク接続が正しく構成されていることを確認してください。

3

Next.js は、データを検索するための複数の方法をサポートしています。APIエンドポイントとなる接続されたデバイスを作成したり、ページに対してサーバー側のレンダリングされた関数を実行したり、ビルド時にデータを取得して静的ページを生成したりできます。このチュートリアルでは、3 つの方法すべての例を示します。

新しいAPIエンドポイント ルートを作成するには、 pagesディレクトリに apiディレクトリを作成します。apiディレクトリで作成する各ファイルは、個別のAPIエンドポイントになります。

apiディレクトリに movies.tsx という新しいファイルを作成します。このエンドポイントとなる接続されたデバイスは、 MongoDBデータベースから映画のリストを返します。次のコードを movies.tsxファイルに追加します。

1import clientPromise from "../../lib/mongodb";
2import { NextApiRequest, NextApiResponse } from 'next';
3
4export 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ルートを追加します。

getServerSideProps() メソッドを使用して、Next.js ページにデータを直接取得できます。このメソッドは、Next.js ページを使用する場合に利用できます。

getServerSideProps() メソッドは、Next.js ページがサーバー側のレンダリングを使用して読み込むように強制します。ページが読み込まれるたびに、 getServerSideProps() メソッドはバックエンドで実行され、データを取得し、 props を通じてReactコンポーネントに送信されます。getServerSideProps() 内のコードはクライアントに送信されません。

pagesディレクトリに movies.tsx という新しいファイルを作成します。次のコードは、getServerSideProps() を使用してMongoDB をクエリする方法を示しています。

1import clientPromise from "../lib/mongodb";
2import { GetServerSideProps } from 'next';
3
4interface Movie {
5 _id: string;
6 title: string;
7 metacritic: number;
8 plot: string;
9}
10
11interface MoviesProps {
12 movies: Movie[];
13}
14
15const 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
35export default Movies;
36
37export 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() メソッドが実行されます。データが頻繁に変更されない場合は、代わりに静的ページ生成を使用してください。

静的ページ生成を使用して、ビルド時にページを事前にレンダリングできます。この方法は、データが頻繁に変更されない場合に便利です。

pagesディレクトリに top.tsx という新しいファイルを作成します。次のコードは、getStaticProps() を使用して、MongoDBデータベースから 100 万の最高評価の映画をレンダーする方法を示しています。

1import { ObjectId } from "mongodb";
2import clientPromise from "../lib/mongodb";
3import { GetStaticProps } from "next";
4
5interface Movie {
6 _id: ObjectId;
7 title: string;
8 metacritic: number;
9 plot: string;
10}
11
12interface TopProps {
13 movies: Movie[];
14}
15
16export 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
36export 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ファイルを表示します。

4

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 ボタンをクリックしてから、任意の場所からのアクセスを許可 ボタンをクリックします。

このチュートリアルの概念の詳細については、次のリソースを参照してください。

戻る

プリズマとの統合

項目一覧