[{"id":1,"title":"NestJS 入门指南(一)","content":"# NestJS 入门指南\r\n\r\n## 1. 什么是 NestJS?\r\n\r\nNestJS 是一个用于构建高效、可扩展的 Node.js 服务器端应用程序的框架。它使用 TypeScript 构建,并结合了面向对象编程(OOP)、函数式编程(FP)和函数式响应式编程(FRP)的元素。NestJS 的架构灵感来自于 Angular,因此如果你有 Angular 开发经验,学习 NestJS 会更加容易。\r\n\r\nNestJS 提供了强大的工具和模块,帮助开发者快速构建可维护的应用程序。它支持多种传输层(如 HTTP、WebSocket、gRPC 等),并且与 TypeORM、Mongoose 等流行的数据库工具集成良好。\r\n\r\n## 2. 安装与设置\r\n\r\n### 2.1 安装 Node.js 和 npm\r\n\r\n在开始使用 NestJS 之前,确保你已经安装了 Node.js 和 npm(Node.js 包管理器)。你可以通过以下命令检查是否已经安装:\r\n\r\n```bash\r\nnode -v\r\nnpm -v\r\n```\r\n\r\n如果未安装,请前往 [Node.js 官网](https://nodejs.org/) 下载并安装。\r\n\r\n### 2.2 安装 NestJS CLI\r\n\r\nNestJS 提供了一个命令行工具(CLI),可以帮助你快速创建和管理项目。你可以通过以下命令全局安装 NestJS CLI:\r\n\r\n```bash\r\nnpm install -g @nestjs/cli\r\n```\r\n\r\n安装完成后,你可以通过以下命令检查是否安装成功:\r\n\r\n```bash\r\nnest --version\r\n```\r\n\r\n### 2.3 创建新项目\r\n\r\n使用 NestJS CLI 创建一个新项目非常简单。运行以下命令:\r\n\r\n```bash\r\nnest new my-nest-app\r\n```\r\n\r\n其中 `my-nest-app` 是你的项目名称。CLI 会提示你选择包管理器(npm 或 yarn),选择后会自动安装依赖并生成项目结构。\r\n\r\n### 2.4 启动开发服务器\r\n\r\n进入项目目录并启动开发服务器:\r\n\r\n```bash\r\ncd my-nest-app\r\nnpm run start\r\n```\r\n\r\n默认情况下,NestJS 应用会在 `http://localhost:3000` 上运行。你可以在浏览器中访问该地址,看到 \"Hello World!\" 的欢迎信息。\r\n\r\n## 3. 项目结构\r\n\r\nNestJS 项目的基本结构如下:\r\n\r\n```\r\nmy-nest-app/\r\n├── src/\r\n│ ├── app.controller.ts\r\n│ ├── app.module.ts\r\n│ ├── app.service.ts\r\n│ └── main.ts\r\n├── test/\r\n│ ├── app.e2e-spec.ts\r\n│ └── jest-e2e.json\r\n├── .eslintrc.js\r\n├── .prettierrc\r\n├── nest-cli.json\r\n├── package.json\r\n├── README.md\r\n├── tsconfig.build.json\r\n└── tsconfig.json\r\n```\r\n\r\n- `src/`:包含应用程序的源代码。\r\n - `app.controller.ts`:控制器,处理 HTTP 请求。\r\n - `app.module.ts`:根模块,用于组织应用程序的各个部分。\r\n - `app.service.ts`:服务层,处理业务逻辑。\r\n - `main.ts`:应用程序的入口文件,用于启动应用。\r\n- `test/`:包含端到端测试文件。\r\n- 其他配置文件:如 TypeScript 配置、ESLint 配置等。\r\n\r\n## 4. 核心概念\r\n\r\n### 4.1 模块(Module)\r\n\r\n模块是 NestJS 应用程序的基本构建块。每个 NestJS 应用至少有一个根模块(通常是 `AppModule`),你可以通过模块来组织应用程序的不同部分。模块使用 `@Module()` 装饰器来定义。\r\n\r\n```typescript\r\nimport { Module } from '@nestjs/common';\r\nimport { AppController } from './app.controller';\r\nimport { AppService } from './app.service';\r\n\r\n@Module({\r\n imports: [],\r\n controllers: [AppController],\r\n providers: [AppService],\r\n})\r\nexport class AppModule {}\r\n```\r\n\r\n### 4.2 控制器(Controller)\r\n\r\n控制器负责处理传入的 HTTP 请求并返回响应。控制器使用 `@Controller()` 装饰器来定义,并且可以定义多个路由处理程序。\r\n\r\n```typescript\r\nimport { Controller, Get } from '@nestjs/common';\r\nimport { AppService } from './app.service';\r\n\r\n@Controller()\r\nexport class AppController {\r\n constructor(private readonly appService: AppService) {}\r\n\r\n @Get()\r\n getHello(): string {\r\n return this.appService.getHello();\r\n }\r\n}\r\n```\r\n\r\n### 4.3 服务(Service)\r\n\r\n服务负责处理业务逻辑,通常被控制器调用。服务使用 `@Injectable()` 装饰器来定义。\r\n\r\n```typescript\r\nimport { Injectable } from '@nestjs/common';\r\n\r\n@Injectable()\r\nexport class AppService {\r\n getHello(): string {\r\n return 'Hello World!';\r\n }\r\n}\r\n```\r\n\r\n### 4.4 提供者(Provider)\r\n\r\n提供者是 NestJS 中的一个重要概念,它可以是一个服务、存储库、工厂等。提供者通过依赖注入(DI)的方式在整个应用程序中共享。\r\n\r\n### 4.5 中间件(Middleware)\r\n\r\n中间件是在请求到达控制器之前执行的函数。它可以用于执行日志记录、身份验证、请求处理等任务。\r\n\r\n### 4.6 管道(Pipe)\r\n\r\n管道用于转换或验证输入数据。例如,你可以使用管道来验证请求参数是否符合预期格式。\r\n\r\n### 4.7 守卫(Guard)\r\n\r\n守卫用于在请求到达控制器之前进行权限验证。例如,你可以使用守卫来检查用户是否具有访问某个路由的权限。\r\n\r\n### 4.8 拦截器(Interceptor)\r\n\r\n拦截器用于在请求处理前后执行额外的逻辑。例如,你可以使用拦截器来记录请求的响应时间。\r\n\r\n## 5. 创建一个简单的 REST API\r\n\r\n让我们通过一个简单的例子来创建一个 REST API。\r\n\r\n### 5.1 创建资源\r\n\r\n使用 NestJS CLI 创建一个新的资源:\r\n\r\n```bash\r\nnest generate resource users\r\n```\r\n\r\nCLI 会提示你选择传输层(选择 REST API),并自动生成控制器、服务、模块等文件。\r\n\r\n### 5.2 定义用户实体\r\n\r\n在 `src/users/entities/user.entity.ts` 中定义一个简单的用户实体:\r\n\r\n```typescript\r\nexport class User {\r\n id: number;\r\n name: string;\r\n email: string;\r\n}\r\n```\r\n\r\n### 5.3 实现服务\r\n\r\n在 `src/users/users.service.ts` 中实现用户服务:\r\n\r\n```typescript\r\nimport { Injectable } from '@nestjs/common';\r\nimport { User } from './entities/user.entity';\r\n\r\n@Injectable()\r\nexport class UsersService {\r\n private users: User[] = [];\r\n\r\n findAll(): User[] {\r\n return this.users;\r\n }\r\n\r\n findOne(id: number): User {\r\n return this.users.find(user => user.id === id);\r\n }\r\n\r\n create(user: User): User {\r\n this.users.push(user);\r\n return user;\r\n }\r\n\r\n update(id: number, updatedUser: User): User {\r\n const index = this.users.findIndex(user => user.id === id);\r\n if (index !== -1) {\r\n this.users[index] = { ...this.users[index], ...updatedUser };\r\n return this.users[index];\r\n }\r\n return null;\r\n }\r\n\r\n remove(id: number): boolean {\r\n const index = this.users.findIndex(user => user.id === id);\r\n if (index !== -1) {\r\n this.users.splice(index, 1);\r\n return true;\r\n }\r\n return false;\r\n }\r\n}\r\n```\r\n\r\n### 5.4 实现控制器\r\n\r\n在 `src/users/users.controller.ts` 中实现用户控制器:\r\n\r\n```typescript\r\nimport { Controller, Get, Post, Body, Param, Put, Delete } from '@nestjs/common';\r\nimport { UsersService } from './users.service';\r\nimport { User } from './entities/user.entity';\r\n\r\n@Controller('users')\r\nexport class UsersController {\r\n constructor(private readonly usersService: UsersService) {}\r\n\r\n @Get()\r\n findAll(): User[] {\r\n return this.usersService.findAll();\r\n }\r\n\r\n @Get(':id')\r\n findOne(@Param('id') id: string): User {\r\n return this.usersService.findOne(+id);\r\n }\r\n\r\n @Post()\r\n create(@Body() user: User): User {\r\n return this.usersService.create(user);\r\n }\r\n\r\n @Put(':id')\r\n update(@Param('id') id: string, @Body() updatedUser: User): User {\r\n return this.usersService.update(+id, updatedUser);\r\n }\r\n\r\n @Delete(':id')\r\n remove(@Param('id') id: string): boolean {\r\n return this.usersService.remove(+id);\r\n }\r\n}\r\n```\r\n\r\n### 5.5 测试 API\r\n\r\n启动开发服务器后,你可以使用 Postman 或 curl 等工具测试 API:\r\n\r\n- `GET /users`:获取所有用户。\r\n- `GET /users/:id`:获取指定用户。\r\n- `POST /users`:创建新用户。\r\n- `PUT /users/:id`:更新指定用户。\r\n- `DELETE /users/:id`:删除指定用户。\r\n\r\n## 6. 总结\r\n\r\nNestJS 是一个功能强大且灵活的框架,适合构建各种规模的 Node.js 应用程序。通过本指南,你已经了解了如何安装 NestJS、创建项目、理解核心概念以及构建一个简单的 REST API。接下来,你可以继续深入学习 NestJS 的高级功能,如身份验证、数据库集成、微服务等。\r\n\r\n希望这篇入门指南能帮助你快速上手 NestJS,祝你编码愉快!\r\n\r\n\r\n\r\n","summary":null,"author_id":1,"category_id":1,"cover_image":"abc","is_published":1,"is_top":0,"view_count":0,"like_count":0,"comment_count":0,"type":"article","created_at":"2025-03-15 15:01:58.037825","updated_at":"2025-03-15 15:01:58.049262"},{"id":2,"title":"NestJS 入门指南(二)","content":"NestJS 是一个用于构建高效、可扩展的 Node.js 服务器端应用程序的框架。","summary":null,"author_id":1,"category_id":null,"cover_image":null,"is_published":1,"is_top":0,"view_count":0,"like_count":0,"comment_count":0,"type":"article","created_at":"2025-03-15 15:01:58.037825","updated_at":"2025-03-15 15:01:58.049262"},{"id":3,"title":"NestJS 入门指南(三)","content":"NestJS 是一个用于构建高效、可扩展的 Node.js 服务器端应用程序的框架。","summary":null,"author_id":1,"category_id":null,"cover_image":null,"is_published":1,"is_top":0,"view_count":0,"like_count":0,"comment_count":0,"type":"article","created_at":"2025-03-15 15:01:58.037825","updated_at":"2025-03-15 15:01:58.049262"},{"id":4,"title":"关于","content":"\r\n\r\n你好!欢迎来到我的个人博客。我是 **小明**,一名热爱技术、写作和分享的程序员。这个博客是我记录学习、思考和成长的地方,也希望能为读者带来一些启发和帮助。\r\n\r\n---\r\n\r\n## 我的技能\r\n\r\n以下是我目前掌握的一些技能:\r\n\r\n- **编程语言**:JavaScript、TypeScript、Python、Java、Go\r\n- **前端技术**:React、Vue、HTML、CSS、TailwindCSS\r\n- **后端技术**:Node.js、Express、NestJS、Django、Spring Boot\r\n- **数据库**:MySQL、PostgreSQL、MongoDB、Redis\r\n- **DevOps**:Docker、Kubernetes、GitLab CI/CD、AWS\r\n- **其他**:Markdown、LaTeX、Linux、Shell 脚本\r\n\r\n---\r\n\r\n## 我的项目\r\n\r\n以下是我参与或独立开发的一些项目:\r\n\r\n### 1. 个人博客系统\r\n- **技术栈**:React + NestJS + MySQL\r\n- **描述**:这是我为自己搭建的博客系统,支持 Markdown 编辑、文章分类、标签管理等功能。\r\n- **源码**:[GitHub 链接](https://github.com)\r\n\r\n### 2. 在线代码编辑器\r\n- **技术栈**:Vue + Monaco Editor\r\n- **描述**:一个轻量级的在线代码编辑器,支持多种编程语言的语法高亮和代码运行。\r\n- **源码**:[GitHub 链接](https://github.com)\r\n\r\n---\r\n\r\n## 代码示例\r\n\r\n以下是一些代码示例,涵盖了多种编程语言:\r\n\r\n### JavaScript\r\n```javascript\r\nfunction greet(name) {\r\n console.log(`Hello, ${name}!`);\r\n}\r\n\r\ngreet(\"World\");\r\n```\r\n\r\n### Python\r\n```python\r\ndef fibonacci(n):\r\n if n <= 1:\r\n return n\r\n else:\r\n return fibonacci(n-1) + fibonacci(n-2)\r\n\r\nprint(fibonacci(10))\r\n```\r\n\r\n### Java\r\n```java\r\npublic class Main {\r\n public static void main(String[] args) {\r\n System.out.println(\"Hello, Java!\");\r\n }\r\n}\r\n```\r\n\r\n### Go\r\n```go\r\npackage main\r\n\r\nimport \"fmt\"\r\n\r\nfunc main() {\r\n fmt.Println(\"Hello, Go!\");\r\n}\r\n```\r\n\r\n### Shell 脚本\r\n```bash\r\n#!/bin/bash\r\necho \"Hello, Shell!\"\r\n```\r\n\r\n---\r\n\r\n## 我的写作\r\n\r\n我喜欢通过写作来总结和分享自己的经验。以下是我写过的一些文章:\r\n\r\n- [《如何搭建一个个人博客》](#)\r\n- [《React Hooks 入门指南》](#)\r\n- [《Node.js 性能优化实践》](#)\r\n- [《Docker 从入门到实践》](#)\r\n\r\n---\r\n\r\n## 我的兴趣\r\n\r\n除了编程,我还有许多其他的兴趣爱好:\r\n\r\n- **阅读**:我喜欢读技术书籍和科幻小说,最近在读《三体》。\r\n- **摄影**:我喜欢用相机记录生活中的美好瞬间。\r\n- **旅行**:我热爱旅行,去过中国的许多城市,也计划未来去更多的地方。\r\n- **音乐**:我会弹吉他,偶尔也会写一些简单的曲子。\r\n\r\n---\r\n\r\n## 联系我\r\n\r\n如果你对我的博客内容感兴趣,或者有任何问题想与我交流,欢迎通过以下方式联系我:\r\n\r\n- **邮箱**:xiaoming@example.com\r\n- **GitHub**:[我的 GitHub](https://github.com)\r\n- **微博**:[我的微博](https://weibo.com)\r\n- **Twitter**:[我的 Twitter](https://twitter.com)\r\n\r\n---\r\n\r\n## 支持我\r\n\r\n如果你喜欢我的博客,可以通过以下方式支持我:\r\n\r\n- **分享文章**:将我的文章分享给更多人。\r\n- **打赏**:如果你觉得我的文章对你有帮助,可以请我喝杯咖啡。\r\n- **反馈**:如果你有任何建议或意见,欢迎告诉我。\r\n\r\n---\r\n\r\n## 友情链接\r\n\r\n以下是一些我常去的网站和博客:\r\n\r\n- [阮一峰的网络日志](https://www.ruanyifeng.com/blog/)\r\n- [掘金](https://juejin.cn)\r\n- [V2EX](https://www.v2ex.com)\r\n\r\n---\r\n\r\n## 最后\r\n\r\n感谢你花时间阅读我的`关于页面`!希望我的博客能为你带来一些收获。如果你有任何问题或想法,欢迎随时联系我。让我们一起学习,共同进步!","summary":null,"author_id":1,"category_id":null,"cover_image":null,"is_published":0,"is_top":0,"view_count":0,"like_count":0,"comment_count":0,"type":"about","created_at":"2025-03-15 15:01:58.037825","updated_at":"2025-03-15 15:01:58.049262"},{"id":13,"title":"测试1","content":"| Header | Header |\r\n|--------|--------|\r\n| Cell | Cell |\r\n| Cell | Cell |\r\n| Cell | Cell |\r\n\r\n```bash\r\nsudo su\r\n```\r\n\r\n> sdfsdf\r\n\r\n`dsfd`\r\n\r\n- 1\r\n- 2\r\n- 3\r\n- 4\r\n\r\n<!-- sdfsdfsdfsdf -->\r\n\r\n**dffsfsdf**\r\n\r\n*sdfsdf*\r\n\r\n~~sdfsdfsdf~~\r\n\r\n\r\n\r\n---\r\n# sdfsdf\r\n\r\n[title](url)\r\n\r\n- [x] Write the press release\r\n- [ ] Update the website\r\n- [ ] Contact the media\r\n\r\n\r\n\r\n","summary":"测试1","author_id":4,"category_id":1,"cover_image":null,"is_published":1,"is_top":1,"view_count":0,"like_count":0,"comment_count":0,"type":"article","created_at":"2025-03-15 15:01:58.037825","updated_at":"2025-03-15 15:01:58.049262"},{"id":14,"title":"fgh","content":"1","summary":null,"author_id":4,"category_id":1,"cover_image":null,"is_published":1,"is_top":0,"view_count":0,"like_count":0,"comment_count":0,"type":"article","created_at":"2025-03-15 15:01:58.037825","updated_at":"2025-03-15 15:01:58.049262"}]
Hello, Hono!