Node.js: 投げっぱなしの Promise に .catch() を付ける(未処理の reject でプロセスが落ちる)
Node 15 以降、ハンドラのない Promise が reject されると既定で例外として扱われ、プロセスが終了する。sendEmail(user) のような「待たずに投げる」呼び出しには必ず .catch() を付ける。
何が起きるか
Node 14 までは警告(UnhandledPromiseRejectionWarning)が出るだけだったが、Node 15 で --unhandled-rejections の既定が throw になった。Web サーバーの中でこうなっていると、メール送信が 1 回失敗しただけでサーバー全体が落ちる。
js
app.post("/signup", async (req, res) => {
const user = await createUser(req.body);
sendWelcomeEmail(user); // await していない。失敗すると未処理の reject → プロセス終了
res.status(201).json(user);
});直し方
js
sendWelcomeEmail(user).catch((err) => {
logger.error({ err }, "welcome email failed");
});- 待たずに投げる処理は「失敗したらどうするか」(ログ・再試行キュー)を
.catch()に書く。 - ESLint の
@typescript-eslint/no-floating-promisesで「await も catch もしていない Promise」を検出できる。意図して投げっぱなしにするならvoid sendWelcomeEmail(user).catch(...)のように明示する。
注意点
process.on("unhandledRejection", ...)で握りつぶすのは最後の手段。状態が壊れたまま動き続けることがあるので、ログを出したうえで終了させ、プロセスマネージャに再起動させるほうが安全。- 落ちる/落ちないは
node --unhandled-rejections=strict|throw|warn|noneで変えられるが、既定(throw)のまま、呼び出し側で処理するのが基本。
出典
- @amitsinha__07 · 2026-10-23
- Node.js ドキュメント
--unhandled-rejections: nodejs.org