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

教程:在 Vercel 上部署 Next.js 应用程序

在本教程中,您学习如何创建连接到MongoDB 的Next.js应用程序。您还将学习;了解如何在托管 Next.js 应用程序的平台 Vercel 上部署应用程序。

注意

This tutorial uses the Next.js 页面路由器,而不是 Next.js 在版本 13 中引入的 App Router。

开始之前,请完成以下步骤:

本教程将指导您完成以下步骤:

  • 创建 Next.js应用程序。

  • 将MongoDB连接到 Next.js。

  • 从 Next.js 查询MongoDB 。

  • 在 Vercel 上部署应用程序。

1

您可以使用with-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 并将其打开。该文件包含一个属性:MONGODB_URI

将MongoDB连接字符串设置为 MONGODB_URI属性的值。您的 env.local文件类似于以下示例:

MONGODB_URI=<Your connection string>

要验证配置,请在终端中运行以下命令,重新启动 Next.js应用程序:

npm run dev

构建应用程序后,在浏览器中导航至 localhost:3000。您会看到 with-mongodb Next.js应用程序欢迎页面。

提示

如果看到"You are connected to MongoDB"消息,则表明连接成功。如果看到“You are NOT connected to MongoDB”消息,请验证连接字符串,确保数据库用户和网络连接配置正确。

3

Next.js 支持多种检索数据的方式。您可以创建API终结点,为页面运行服务器端呈现的函数,或通过在构建时获取数据来生成静态页面。本教程展示了所有这三种方法的示例。

要创建新的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}

前面的代码创建一个API终结点,该终结点返回 sample_mflix数据库中排名最高的 10 部电影,并按其 metacritic 评分降序排列。res.json 方法以JSON格式向浏览器提供电影数组。当导航到 localhost:3000/api/movies 时,浏览器会显示从数据库返回的电影列表。

通过在 api目录中创建其他文件来添加更多API路由。

您可以使用 getServerSideProps() 方法将数据直接获取到 Next.js 页面。当您使用 Next.js 页面时,此方法可用。

getServerSideProps() 方法强制 Next.js 页面使用服务器端呈现进行加载。每次加载页面时,getServerSideProps() 方法都会在后端运行,获取数据,并通过属性将其发送到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() 方法接收属性,并使用该数据渲染页面。该页面显示排名靠前的电影标题、Metacritic 评分和情节。

注意

每次调用该页面时,getServerSideProps() 方法都会运行。如果您的数据不经常更改,请改用静态页面生成。

您可以使用静态页面生成功能在构建时预渲染页面。当数据不经常更改时,此方法非常有用。

pages目录中创建一个名为 top.tsx 的新文件。以下代码展示了如何使用 getStaticProps() 渲染MongoDB 数据库中评分最高的前 1000 部电影:

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 时,浏览器会显示电影列表。

在开发模式下,应用程序每次都会调用 getStaticProps() 方法,类似于 getServerSideProps() 方法。在生产模式下,/top 页面几乎会立即预呈现并加载。

要在生产模式下运行Next.js应用程序,请先构建。然后,运行start 命令以提供服务构建的应用程序。在终端中运行以下命令:

npm run build
npm run start

当您运行npm run start 命令时,Next.js 会在生产模式下为您的应用程序提供服务。getStaticProps() 方法不会在您每次访问权限/top 路由时运行,因为 Next.js 以静态方式提供服务该页面。要查看预呈现的静态页面,请查看 .next/server/pages/top.html文件。

4

使用 Vercel 上的MongoDB部署 Next.js应用程序。在部署之前,必须将前面步骤中的应用程序代码提交到 GitHub存储库。要学习;了解如何创建Github帐户并提交到存储库,请参阅 GitHub 文档。

在将代码提交到存储库后,导航到Vercel并登录。在 Vercel仪表盘上,单击导入项目按钮,然后单击导入 Git 存储库

输入 GitHub存储库URL ,然后单击继续。在下一个屏幕上,添加 env.local文件中的变量。

单击部署按钮。Vercel 会自动构建和部署 Next.js应用程序。完成后,您将收到一个URL ,您可以在其中访问权限您的应用程序。

注意

Vercel 使用动态IP地址,因此您必须在MongoDB Atlas仪表盘添加例外,才能从任何IP地址访问权限数据。为此,请导航到“网络访问”标签页,单击 Add IP Address 按钮,然后单击允许从任何地方访问按钮。

有关本教程中概念的更多信息,请参阅以下资源:

后退

与Prisma集成

在此页面上