テック技報最新号へ →
コード

Node.js: 投げっぱなしの Promise に .catch() を付ける(未処理の reject でプロセスが落ちる)

Node 15 以降、ハンドラのない Promise が reject されると既定で例外として扱われ、プロセスが終了する。sendEmail(user) のような「待たずに投げる」呼び出しには必ず .catch() を付ける。

@amitsinha__07 · 投稿 2026-10-23
#nodejs#javascript#promise#error-handling

何が起きるか

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)のまま、呼び出し側で処理するのが基本。

出典

X の元の投稿を開く