NestJS、PostgreSQL 和 Docker 这三个强大的工具可以帮助您快速轻松地构建健壮的 Web 应用程序。NestJS 是一个现代的、渐进的 Node.js 框架,允许您使用 TypeScript 构建服务器端应用程序。PostgreSQL 是一个功能强大的开源数据库管理系统,可提供可靠的数据存储和检索。Docker 是一个容器化平台,可简化应用程序的部署和管理。
这三个工具为构建可伸缩且高效的 Web 应用程序提供了强大的工具包。本文将为初学者提供使用 NestJS、PostgreSQL 和 Docker 构建 Web 应用程序的友好指南。
用于构建高效且可扩展的服务器端应用程序的渐进式Node.js框架。
描述
Nest框架 TypeScript 入门存储库。
安装
$ npm install
运行应用程序
# development
$ npm run start
# watch mode
$ npm run start:dev
# production mode
$ npm run start:prod
测试
# unit tests
$ npm run test
# e2e tests
$ npm run test:e2e
# test coverage
$ npm run test:cov
先决条件
- 对 TypeScript、PostgreSQL 和 RESTful API 的基本了解
- 在您的计算机上安装 Docker Desktop(运行命令
docker -v以验证安装);如果没有,从这里安装
设置 NestJS 应用程序
要安装 Node,我们转到Nodejs 网站并按照说明进行操作。我们使用下面的终端命令验证 Node.js 的安装:
node -v
v18.15.0 //node version installed
结果显示了我们在计算机上安装的 Node.js 版本。
接下来我们将全局安装 NestJS 并通过在我们的终端中运行以下命令来初始化一个新项目:
$ npm i -g @nestjs/cli
$ nest new nest-docker-postgres
确保npm从提示中选择包管理器。
使用以下命令启动开发服务器并访问http://localhost:3000/以查看应用程序运行情况:
$ npm run start:dev
容器化应用程序
Dockerfile为了容器化我们的 NestJS 应用程序,我们首先在项目的根目录中创建一个名为的文件,然后docker-compose.yml在项目的根目录中创建一个文件。
设置Dockerfile用于运行应用程序的容器。它安装必要的依赖项,将应用程序代码复制到容器中,构建应用程序,并使用生产构建启动服务器。
该docker-compose文件设置了一个多容器环境。在其中,我们将使用 PostgreSQL 和 pgAdmin 运行 NestJS 应用程序。
文件
FROM node:18
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
CMD [ "npm", "run", "start:dev" ]
以下是此文件中每个命令的作用:
FROM node:18:指定 Docker 容器的基础镜像。在这种情况下,我们使用官方 Node.js18.x图像作为基础。WORKDIR /app: 将容器内的工作目录设置为/app. 这是应用程序代码将被复制的地方,也是容器运行的地方。COPY package*.json ./: 将宿主机当前目录中的package.json和文件复制到容器中的目录中。in允许我们一次复制这两个文件。package-lock.json``/app``*``package*.jsonRUN npm install:在容器中安装应用程序依赖项。该步骤使用npm install命令安装 中列出的依赖项package.json。COPY . .:将应用程序代码从宿主机复制到/app容器中的目录中。RUN npm run build:该npm run build命令用于在容器中构建应用程序。此命令通常会创建一个dist文件夹,其中包含应用程序的生产版本。CMD ["npm", "run", "start:dev"]:指定容器启动时要运行的命令。在这种情况下,我们正在运行命令npm run start:dev,它将以开发模式启动服务器。此命令监视代码中的更改并在检测到更改时自动重建容器。这允许更快的开发周期,因为可以在容器中快速测试对代码的更改,而无需手动重建或重新启动。
docker-compose.yml
version: '3.5'
services:
db:
image: postgres
restart: always
environment:
- POSTGRES_PASSWORD=postgres
container_name: postgres
volumes:
- ./pgdata:/var/lib/postgresql/data
ports:
- '5432:5432'
app:
build:
context: .
dockerfile: Dockerfile
container_name: nest-docker-postgres
environment:
- PORT=${PORT}
ports:
- '3000:3000'
depends_on:
- db
volumes:
- ./src:/app/src
pgadmin:
image: dpage/pgadmin4
restart: always
container_name: nest-pgadmin4
environment:
- PGADMIN_DEFAULT_EMAIL=admin@admin.com
- PGADMIN_DEFAULT_PASSWORD=pgadmin4
ports:
- '5050:80'
depends_on:
- db
在这个文件中:
version:Docker Compose 文件开头的这个字段指定我们正在使用的 Compose 文件格式的版本。db:此服务使用来自 Docker Hub 的官方图像设置 PostgreSQL 数据库postgres。它将用户的密码设置postgres为postgres,创建一个用于pgdata存储数据库数据的命名卷,并将容器端口映射5432到主机端口5432。该restart: always选项确保容器在崩溃或停止时自动重启。appDockerfile:此服务使用当前目录中的为 NestJS 应用程序构建 Docker 映像。它将容器名称设置为nest-docker-postgres,将环境变量设置PORT为主机环境变量的值PORT,将容器端口映射3000到主机端口3000,并将src主机上的目录挂载到/app/src容器中的目录。该depends_on选项指定此服务依赖于db服务,意味着db容器将在容器之前启动app。pgadmindpage/pgadmin4:此服务使用Docker Hub 中的映像设置 pgAdmin,这是一个基于 Web 的 PostgreSQL 管理工具。它将容器名称设置为nest-pgadmin4,设置 pgAdmin 登录的默认电子邮件和密码,将容器端口映射80到主机端口5050,并指定此服务依赖于该db服务。
我们还需要添加一个名为.dockerignore. .dockerignore它指定应从 Docker 构建上下文中排除的文件和目录。
.dockerignore
Dockerfile
.dockerignore
node_modules
npm-debug.log
dist
构建容器
接下来我们需要做的是构建以在 Docker 中运行我们的应用程序——构建容器。运行以下命令以容器化应用程序:
$ docker compose up
该命令查找**docker-compose.yml**文件中指定的服务并为它们创建容器。如果这些服务所需的镜像在本地不可用,Docker 将从 Docker Hub 或任何其他已配置的注册表中拉取它们。如果镜像已经在本地可用,Docker 将使用它们而不是再次拉取它们。
容器启动并运行后,我们可以通过在 Web 浏览器中访问http://localhost:3000 来访问 NestJS 应用程序,在 Web 浏览器中访问http://localhost:5050来访问 pgAdmin。
使用我们之前在文件中指定的电子邮件和密码登录 pgAdmin docker-compose.yml,然后我们将看到:
设置 pgAdmin 和 PostgreSQL 服务器
要从 PgAdmin 连接到 PostgreSQL 服务器,我们需要在 PgAdmin 中创建一个服务器对象,其中包含 PostgreSQL 服务器的详细信息。
以下是在 PgAdmin 中创建服务器的步骤:
-
通过访问http://localhost:5050在 Web 浏览器中打开 PgAdmin (假设我们使用文件中的默认配置**
docker-compose.yml**)。 -
docker-compose.yml使用服务文件中的电子邮件和密码登录pgadmin。 -
在左侧边栏中,单击
Servers以展开Servers菜单。 -
右键单击
Servers并选择Register->Server。 -
在对话框
General的选项卡中Create - Server,我们可以为服务器指定一个我们选择的名称。 -
在
Connection选项卡中,填写以下详细信息:- 主机名/地址:db
- 端口:5432
- 维护数据库:postgres
- 用户名:postgres
- 密码:postgres
-
单击
Save以保存服务器配置。
注意: 由于 PostgreSQL 服务器在 Docker 容器中运行,因此主机名/地址将是文件中定义的数据库容器的 Docker 服务名称**
docker-compose.yml** 。默认情况下,服务名称成为 Docker 网络中容器的主机名/地址。
我们现在应该在 PgAdmin 的左侧边栏中看到我们创建的服务器。我们可以展开服务器以查看其中的数据库和其他对象。
从 NestJS 连接到 PostgreSQL 服务器
Nest 提供了@nestjs/typeorm与 SQL 和 NoSQL 数据库集成的包。使用以下命令安装软件包:
$ npm install --save @nestjs/typeorm typeorm pg
接下来,在app.module.ts文件中的数组中添加以下代码imports:
TypeOrmModule.forRoot({
type: 'postgres',
host: 'db',
port: 5432,
username: 'postgres',
password: 'postgres',
database: 'postgres',
entities: [],
synchronize: true,
autoLoadEntities: true,
}),
TypeOrmModule我们从包中导入@nestjs/typeorm。
我们将一个options对象传递给以TypeOrmModule配置 PostgreSQL 连接详细信息。该type选项指定正在使用的数据库管理系统,PostgreSQL。、、、和选项提供 PostgreSQL 服务器的连接详细信息host。port``username``password``database
我们使用该entities选项来指定应用程序使用的实体。实体表示应用程序中的数据模型,可用于查询数据库。在这种情况下我们不指定实体,因为我们通过设置为动态加载autoLoadEntities它们true。
我们将synchronize选项设置为true,这意味着 TypeORM 将根据实体自动生成数据库表。但是,在生产中应谨慎使用此选项,因为它可能会导致数据丢失和冲突。
由于所做的更改,要重建我们的应用程序容器,我们执行以下命令:
$ docker compose up --build
瞧,我们的应用程序已连接到在 Docker 中运行的 PostgreSQL 服务器。我们现在可以开始创建实体并在它们之上构建 API。
结论
总之,我们已经在分步指南中了解了如何使用 Docker 和 PostgreSQL 设置 NestJS 应用程序。将 Docker 和 PostgreSQL 与 NestJS 结合使用可以使您的 Web 应用程序开发更快、更高效。