使用 ServBay 在 macOS 本地创建并运行 NestJS 项目
NestJS 是一个用于构建高效、可扩展的 Node.js 服务器端应用程序的渐进式 Node.js 框架。它使用 TypeScript 编写,并且受 Angular 的启发,采用了模块化架构和依赖注入(DI)模式。NestJS 提供了强大的工具和功能,使得开发者可以轻松构建可维护、可测试且高度解耦的复杂应用程序。
NestJS 的主要特性和优势
- 模块化架构:通过模块来组织代码,使得应用程序更加结构化、易于理解和维护。
- 依赖注入:提供了强大且易于使用的依赖注入系统,极大地增强了代码的可测试性和可维护性。
- 使用 TypeScript:充分利用 TypeScript 的静态类型检查、接口和现代 JavaScript 特性,提高了开发效率和代码质量,减少运行时错误。
- 丰富的装饰器:使用装饰器(Decorators)来定义控制器、服务、模块等,使得代码更加简洁、声明性强且意图明确。
- 强大的生态系统:NestJS 拥有活跃的社区和丰富的第三方模块及插件支持,可以轻松集成 TypeORM、Mongoose、GraphQL、WebSockets、缓存、验证等常用功能。
- 基于标准:构建于 Express 或 Fastify 等成熟的 HTTP 服务器框架之上,提供了良好的兼容性和性能。
使用 NestJS,开发者可以采用后端开发的最佳实践(如 SOLID 原则、设计模式)来快速构建高性能、企业级的 Web 应用、API 服务、微服务等。
使用 ServBay 创建并运行 NestJS 项目
ServBay 为 macOS 提供了强大且集成的本地 Web 开发环境,内置了多种版本的 Node.js 以及常用的数据库和 Web 服务器。在本指南中,我们将利用 ServBay 提供的 Node.js 环境和『网站』功能来创建、运行并配置一个 NestJS 项目。我们将通过 ServBay 的反向代理功能,使得您的本地 NestJS 应用可以通过自定义域名进行访问。
前提条件
在开始之前,请确保您已经完成以下准备工作:
- 安装 ServBay:您已经在 macOS 上成功安装了 ServBay。
- 启用 Node.js 软件包:通过 ServBay 控制面板的『软件包』(Packages) 选项卡,确保您已选择并安装了需要的 Node.js 版本。如果您尚未启用 Node.js,请参考 ServBay Node.js 使用指南 进行设置。
创建 NestJS 项目
全局安装 NestJS CLI
打开终端,使用 npm(通常随 Node.js 一起安装)全局安装 NestJS 命令行工具 (CLI)。NestJS CLI 是一个强大的工具,用于初始化、开发和维护 NestJS 应用程序。
bashnpm install -g @nestjs/cli
1初始化项目
切换到 ServBay 建议的网站根目录
/Applications/ServBay/www
。这个目录是 ServBay 默认配置的网站存放位置,在此创建项目可以方便后续的网站配置。然后使用 NestJS CLI 创建一个新的项目:bashcd /Applications/ServBay/www nest new servbay-nest-app
1
2执行此命令后,NestJS CLI 会引导您完成项目创建过程,包括选择包管理器(npm, yarn 或 pnpm)。建议选择 npm 以保持一致性。项目将被创建在
/Applications/ServBay/www/servbay-nest-app
目录下。安装项目依赖
进入新创建的项目目录
servbay-nest-app
并安装项目所需的依赖包:bashcd servbay-nest-app npm install
1
2nest new
命令已经自动执行了npm install
,但再次运行可以确保所有依赖都已正确安装或更新。
修改 NestJS 项目输出内容 (可选)
为了验证项目是否成功运行并通过 ServBay 访问,我们可以修改项目的默认根路由响应。
修改
src/app.controller.ts
文件使用您喜欢的代码编辑器打开项目目录下的
src/app.controller.ts
文件。将其内容修改如下,使根路径 (/
) 访问时返回 "Hello ServBay!" 字符串:typescriptimport { Controller, Get } from '@nestjs/common'; import { AppService } from './app.service'; // 假设您保留了 AppService @Controller() export class AppController { constructor(private readonly appService: AppService) {} // 如果保留 AppService @Get() getHello(): string { // return this.appService.getHello(); // 如果使用 AppService return 'Hello ServBay!'; // 直接返回字符串 } }
1
2
3
4
5
6
7
8
9
10
11
12
13这段代码定义了一个简单的控制器,它处理 HTTP GET 请求到应用的根路径 (
/
) 并返回指定的字符串。
在开发模式下运行 NestJS 项目并通过 ServBay 访问
NestJS 项目通常在开发模式下使用内置的服务器运行,监听一个特定的端口。然后,您可以使用 ServBay 的『网站』功能配置一个反向代理,将自定义域名指向这个正在运行的 NestJS 进程端口。
启动开发服务器
在项目根目录
/Applications/ServBay/www/servbay-nest-app
中,运行以下命令启动 NestJS 应用的开发服务器。我们通过设置PORT
环境变量来指定应用监听的端口,例如8585
。bashcd /Applications/ServBay/www/servbay-nest-app PORT=8585 npm run start:dev
1
2npm run start:dev
是 NestJS 项目中预定义的脚本,它会使用ts-node
运行您的 TypeScript 代码,并开启文件监听,以便在代码修改时自动重启服务器。服务器启动后,会监听在localhost:8585
。配置 ServBay 网站反向代理
打开 ServBay 控制面板,切换到『网站』(Websites) 选项卡。点击添加按钮(通常是
+
号)创建一个新的网站配置:- 名字 (Name):为您的网站起一个易于识别的名字,例如
My first NestJS dev site
。 - 域名 (Domains):输入您想在本地访问该项目的域名,例如
servbay-nest-test.dev
。ServBay 默认会将.dev
等顶级域名解析到本地,无需修改 hosts 文件。 - 类型 (Type):选择
反向代理 (Reverse Proxy)
。 - IP 地址 (IP Address):输入 Node.js 应用监听的 IP 地址,通常是
127.0.0.1
(本地回环地址)。 - 端口 (Port):输入 NestJS 应用正在监听的端口,这里是
8585
。
配置完成后,保存设置。ServBay 会自动更新其 Web 服务器(Caddy 或 Nginx)配置。关于如何在 ServBay 中配置网站的更多详细信息,请参考 ServBay 添加网站文档。
- 名字 (Name):为您的网站起一个易于识别的名字,例如
访问开发模式网站
打开您的 Web 浏览器,访问您刚才配置的域名
https://servbay-nest-test.dev
。注意:
- ServBay 默认会为通过其配置的本地网站提供免费的 SSL 证书(由 ServBay User CA 签发),因此您可以使用
https
进行安全访问。如果遇到证书警告,您可能需要信任 ServBay User CA 证书。请参考 使用 SSL 保护网站文档 了解详情。 - 确保您的 NestJS 开发服务器 (
PORT=8585 npm run start:dev
) 正在运行。如果停止,访问域名将无法成功。
- ServBay 默认会为通过其配置的本地网站提供免费的 SSL 证书(由 ServBay User CA 签发),因此您可以使用
部署生产版本并通过 ServBay 访问
在将 NestJS 应用部署到生产环境(即使是本地模拟的生产环境)之前,通常需要先构建项目。
构建生产版本
在项目根目录
/Applications/ServBay/www/servbay-nest-app
中,运行以下命令构建项目:bashcd /Applications/ServBay/www/servbay-nest-app npm run build
1
2npm run build
命令会使用 TypeScript 编译器将项目源代码编译到dist
目录中。运行生产服务器
构建完成后,运行以下命令启动生产版本的 NestJS 应用。通常使用
node
命令直接运行编译后的 JavaScript 文件。同样,我们指定一个端口,例如8586
,并且设置NODE_ENV=production
环境变量。bashcd /Applications/ServBay/www/servbay-nest-app PORT=8586 NODE_ENV=production node dist/main.js
1
2生产模式下通常不会有文件监听和热重载。
配置 ServBay 网站反向代理
回到 ServBay 控制面板的『网站』选项卡,添加或修改一个网站配置用于访问生产版本:
- 名字 (Name):例如
My first NestJS production site
。 - 域名 (Domains):例如
servbay-nest-test.prod
。 - 类型 (Type):
反向代理 (Reverse Proxy)
。 - IP 地址 (IP Address):
127.0.0.1
。 - 端口 (Port):
8586
(与生产服务器监听的端口一致)。
保存设置。
- 名字 (Name):例如
访问生产模式网站
打开浏览器,访问
https://servbay-nest-test.prod
查看您的 NestJS 应用生产版本。同样,ServBay 会提供 SSL 加密。
连接到 ServBay 提供的数据库
ServBay 内置并支持多种数据库系统,包括 MariaDB (兼容 MySQL)、PostgreSQL、MongoDB 和 Redis。在开发 NestJS 应用时,您可以很方便地连接并使用这些数据库。
重要提示: 在尝试连接数据库之前,请确保您已通过 ServBay 控制面板的『软件包』(Packages) 选项卡中启用了相应的数据库软件包。您可以在 ServBay 控制面板或相关文档中找到数据库的默认端口、用户名和密码信息。对于生产环境,强烈建议修改默认凭据并创建专门的数据库用户。
以下是 NestJS 中使用常见 ORM/库连接 ServBay 提供的数据库的示例配置代码。这些示例通常放在应用的根模块 (AppModule
) 或专门的数据库模块中。
连接 MongoDB
使用
@nestjs/mongoose
模块连接 MongoDB。首先安装所需的包:bashnpm install @nestjs/mongoose mongoose
1然后在您的 NestJS 模块中配置
MongooseModule
:typescriptimport { Module } from '@nestjs/common'; import { MongooseModule } from '@nestjs/mongoose'; // ... 其他导入 @Module({ imports: [ MongooseModule.forRoot('mongodb://localhost:27017/servbay-nest-app'), // 默认端口 27017 // ... 其他模块 ], controllers: [], // ... providers: [], // ... }) export class AppModule {}
1
2
3
4
5
6
7
8
9
10
11
12
13ServBay 默认的 MongoDB 连接字符串通常是
mongodb://localhost:27017/
。您可能需要使用 MongoDB 客户端(如 MongoDB Compass 或mongosh
)连接localhost:27017
来创建servbay-nest-app
数据库。连接 Redis
使用
@nestjs/redis
模块连接 Redis。首先安装所需的包:bashnpm install @nestjs/redis redis @types/redis
1然后在您的 NestJS 模块中配置
RedisModule
:typescriptimport { Module } from '@nestjs/common'; import { RedisModule } from '@nestjs/redis'; // ... 其他导入 @Module({ imports: [ RedisModule.forRoot({ url: 'redis://localhost:6379', // 默认端口 6379 }), // ... 其他模块 ], controllers: [], // ... providers: [], // ... }) export class AppModule {}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15ServBay 默认的 Redis 服务器地址是
localhost:6379
。连接 MariaDB (兼容 MySQL)
使用
@nestjs/typeorm
模块连接 MariaDB。ServBay 同时支持 MariaDB 和 MySQL 软件包,它们都与 MySQL 协议兼容。TypeORM 的mysql
或mariadb
类型都可以连接 ServBay 提供的 MariaDB/MySQL 实例。首先安装所需的包:bashnpm install @nestjs/typeorm mysql2 typeorm
1然后在您的 NestJS 模块中配置
TypeOrmModule
:typescriptimport { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; // ... 其他导入 @Module({ imports: [ TypeOrmModule.forRoot({ type: 'mariadb', // 或者 'mysql' host: 'localhost', port: 3306, // 默认端口 3306 username: 'root', // ServBay MariaDB/MySQL 默认 root 用户 password: 'password', // ServBay MariaDB/MySQL 默认 root 密码 database: 'servbay_nest_app', // 需要先创建此数据库 entities: [], // 您的实体类数组 synchronize: true, // 开发环境可以设置为 true,生产环境慎用 }), // ... 其他模块 ], controllers: [], // ... providers: [], // ... }) export class AppModule {}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22注意: ServBay MariaDB/MySQL 的默认
root
用户密码是password
。您需要使用数据库客户端(如 TablePlus, DBeaver 或 MySQL CLI)连接localhost:3306
,使用root
/password
登录并手动创建servbay_nest_app
数据库。出于安全考虑,强烈建议您修改root
密码并创建具有最小权限的数据库用户用于应用连接。连接 PostgreSQL
使用
@nestjs/typeorm
模块连接 PostgreSQL。首先安装所需的包:bashnpm install @nestjs/typeorm pg typeorm
1然后在您的 NestJS 模块中配置
TypeOrmModule
:typescriptimport { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; // ... 其他导入 @Module({ imports: [ TypeOrmModule.forRoot({ type: 'postgres', host: 'localhost', port: 5432, // 默认端口 5432 username: 'servbay', // ServBay PostgreSQL 默认用户示例,请检查实际情况 password: 'password', // ServBay PostgreSQL 默认密码示例,请检查实际情况 database: 'servbay_nest_app', // 需要先创建此数据库 entities: [], // 您的实体类数组 synchronize: true, // 开发环境可以设置为 true,生产环境慎用 }), // ... 其他模块 ], controllers: [], // ... providers: [], // ... }) export class AppModule {}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22注意: ServBay PostgreSQL 的默认用户和密码可能根据版本有所不同,常见的默认用户可能是
servbay
或postgres
。请检查 ServBay 控制面板或文档以获取准确的默认凭据,并使用 PostgreSQL 客户端连接localhost:5432
创建servbay_nest_app
数据库以及相应的用户(如果需要)。出于安全考虑,生产环境请务必修改默认凭据。
总结
通过本指南,您已经了解了如何利用 ServBay 在 macOS 本地环境中快速创建、运行和访问 NestJS 项目。ServBay 集成的 Node.js 环境、便捷的网站配置(特别是反向代理功能)以及内置的多种数据库支持,极大地简化了 NestJS 应用的本地开发和测试流程。您可以轻松切换开发和生产模式,并通过自定义域名和 HTTPS 安全地访问您的本地应用,同时也方便地连接到 ServBay 提供的强大数据库服务。