# 热更新与调试技巧

URL: https://caijiao.org/fastify/deploy/debugging
Source: docs/fastify/deploy/debugging.md
Description: 本节将介绍在开发 Fastify 项目时使用热更新和调试技巧，帮助提升开发效率。

在开发 [Fastify](/fastify/) 项目时，热更新和调试技巧能够帮助我们更快速地开发和排查问题。本节将介绍如何使用热更新工具和调试技巧来提升开发效率。

## 1. 使用 nodemon 实现热更新

在开发过程中，频繁修改代码并重启服务器是一个常见的操作。`nodemon` 是一个非常适合用来自动重启 Node.js 应用的工具。它监视文件变化并自动重启应用，极大地提升了开发效率。

### 安装 nodemon

首先，通过以下命令全局安装 `nodemon`：

```bash
npm install -g nodemon
```

### 配置 nodemon

你可以通过 `nodemon.json` 文件配置 `nodemon` 的行为，避免每次启动时都需要输入命令行参数。例如，创建一个 `nodemon.json` 文件，内容如下：

```json
{
  "watch": ["app.ts"],
  "ext": "ts",
  "exec": "ts-node app.ts"
}
```

这样配置后，`nodemon` 将会监视 `app.ts` 文件的变化，并使用 `ts-node` 重新启动 [Fastify](/fastify/) 应用。

### 启动项目

使用以下命令启动应用：

```bash
nodemon
```

每次修改 `app.ts` 文件时，`nodemon` 会自动重启 Fastify 服务器，无需手动干预。

## 2. 使用 Visual Studio Code 进行调试

Visual Studio Code（VSCode）提供了强大的调试功能，支持 Node.js 调试。我们可以配置 VSCode 来调试 Fastify 项目。

### 配置调试器

在 VSCode 中，打开调试面板（点击左侧的调试图标），然后点击“创建一个 launch.json 文件”进行配置。在弹出的选项中，选择 `Node.js` 环境。

然后，修改生成的 `launch.json` 文件，内容如下：

```json
{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "node",
      "request": "launch",
      "name": "Launch Program",
      "skipFiles": ["<node_internals>/**"],
      "program": "${workspaceFolder}/app.ts",
      "preLaunchTask": "tsc: build - tsconfig.json"
    }
  ]
}
```

这会让 VSCode 使用 TypeScript 编译器（`tsc`）在调试时先进行编译，然后启动 `app.ts` 文件。

### 启动调试

- 点击左侧调试面板中的“播放”按钮，启动调试。
- 你可以在代码中设置断点，调试时会自动停在断点处，查看变量的值和调用栈。

## 3. 使用 Fastify 的内置日志进行调试

Fastify 提供了内置的日志系统（基于 Pino），可以帮助我们在开发过程中输出调试信息。你可以通过调整日志级别来控制输出的信息量。

### 配置日志级别

Fastify 默认的日志级别为 `info`，你可以在启动时修改日志级别，例如：

```ts
const fastify = require('fastify')({
  logger: {
    level: 'debug'  // 修改日志级别为 debug
  }
});
```

通过将日志级别设置为 `debug`，你将能够看到更多的调试信息，这对排查问题非常有帮助。

### 使用日志记录自定义信息

你可以在应用的任何位置使用 `fastify.log` 记录调试信息：

```ts
fastify.log.debug('This is a debug message');
fastify.log.info('This is an info message');
fastify.log.error('This is an error message');
```

日志系统会根据当前的日志级别输出对应的信息。

## 4. 使用 TypeScript 支持调试

如果你使用 TypeScript 来开发 Fastify 项目，确保你在 `tsconfig.json` 中启用了 `sourceMap`，这样可以确保调试器能够映射 TypeScript 代码到对应的 JavaScript 代码。

### 配置 `tsconfig.json`

```json
{
  "compilerOptions": {
    "target": "ES6",
    "module": "CommonJS",
    "outDir": "./dist",
    "sourceMap": true
  }
}
```

启用 `sourceMap` 后，调试器就能够准确地将 TypeScript 代码映射到生成的 JavaScript 代码，方便进行调试。

## 5. 使用断言和单元测试辅助调试

Fastify 支持与各种测试框架集成，如 Jest 和 Mocha，你可以编写测试用例来帮助验证你的 API 和功能，确保它们按预期工作。

### 使用 Jest 编写测试

首先，安装 Jest：

```bash
npm install --save-dev jest ts-jest @types/jest
```

然后，创建一个测试文件 `app.test.ts`，内容如下：

```ts
import fastify from 'fastify';
import app from './app';

describe('GET /users', () => {
  it('should return a list of users', async () => {
    const response = await app.inject({
      method: 'GET',
      url: '/users',
    });
    expect(response.statusCode).toBe(200);
    expect(response.json()).toEqual([
      { id: 1, name: 'John Doe' },
      { id: 2, name: 'Jane Smith' }
    ]);
  });
});
```

运行测试：

```bash
npx jest
```

通过自动化测试，你可以更容易地发现和解决问题。

## 6. 总结

在开发 Fastify 项目时，热更新和调试技巧非常重要，可以显著提高开发效率。使用 `nodemon` 可以实现代码变更后的自动重启，VSCode 提供了强大的调试功能，Fastify 的内置日志和 TypeScript 的调试支持也能帮助我们快速排查问题。通过这些技巧，我们可以更加高效地开发和维护 Fastify 应用。
