# SC200：进行中的请求未完成

> SC200（进行中的请求未完成）表示收到 SIGTERM 时正在处理的请求，没能在关闭截止时间前完成。本文列出常见原因和修复方法。

Source: https://shutdown.jscrate.dev/zh/docs/codes/sc200
Last updated: 2026-09-23

`SC200` 表示关闭截止时间到了，一个进行中的请求仍未结束。它既没有完成，也没有失败，连接一直开着。

| | |
| --- | --- |
| 诊断码 | `SC200` (FAIL) |
| 阶段 | 进行中请求的响应 |
| CLI 退出码 | 1 |
| 含义 | 收到 SIGTERM 时正在运行的请求，没有在关闭截止时间前完成。 |
| 输出信息 | `In-flight request #<n> did not finish within <shutdown.deadlineMs> ms` |
| 首先检查 | 用 `server.close()` 停止接受连接，让未完成的请求完成；不要等待永远不会结束的 keep-alive socket 或定时器。 |

## 请求为什么会卡住？

- 关闭处理函数在等请求结束，而请求又在等关闭时的清理完成。
- 某个数据库调用、上游请求或锁一直没有结束。
- 服务器停止了读写，却没有关闭响应。
- `shutdown.deadlineMs` 比这个操作预期需要的时间短。
- 某个定时器或流没有关闭。

## 如何修复？

1. 在慢的处理函数和每个关闭步骤前后加日志。
2. 先让进行中的处理函数完成，再关闭它们依赖的资源。
3. 给网络、数据库和队列操作设置超时。
4. 把 `deadlineMs` 设得比最慢的正常请求更长，但要短于平台的强制终止时限。

不要用 `process.exit()` 来消除这个诊断码。这样会切断连接，把失败变成 [SC201](https://shutdown.jscrate.dev/zh/docs/codes/sc201)。

## 如何确认已修复？

时间线中应在截止时间之前出现 `work request finished`。如果一个看起来正常的响应仍可能掩盖没做完的工作，就加上 `bodyIncludes`。

用最慢的正常操作来测试，不要只用固定的 sleep。如果外部系统可能卡住，把它们自己的超时处理路径作为单独的失败场景来测试。

## 相关内容

- [编写优雅关闭处理函数](https://shutdown.jscrate.dev/zh/docs/guides/graceful-shutdown-nodejs)
- [设置关闭截止时间](https://shutdown.jscrate.dev/zh/docs/configuration#shutdown)
- [SC201：请求被中断](https://shutdown.jscrate.dev/zh/docs/codes/sc201)
- [SC300：服务未退出](https://shutdown.jscrate.dev/zh/docs/codes/sc300)
