AceDevHub
Advanced Node.js Interview QuestionsAdvancedScenario

Node.js · Question 95

How would you implement centralized error handling middleware?

Direct answer

Use four-argument Express error middleware or Fastify setErrorHandler last — map AppError to status/code, log stack server-side, return safe JSON envelope, handle async errors via next(err) or framework auto-catch.

Scenario: consistent { error: { code, message } } responses across all AceDevHub API routes (Q62).

  1. AppError class — statusCode, code, isOperational flag.
  2. Throw in services — throw new AppError('Not found', 404).
  3. Handler last — after all routes; four args (err, req, res, next).
  4. Unknown errors — log full stack; respond 500 generic message.
scenario-error-middleware.mjs
app.use((err, req, res, next) => {
  const status = err.statusCode ?? 500;
  const code = err.code ?? "INTERNAL";

  req.log?.error({ err, url: req.url }, err.message);

  res.status(status).json({
    error: {
      code,
      message: status < 500 ? err.message : "Internal Server Error",
    },
  });
});

// Async route
app.get("/x", async (req, res, next) => {
  try {
    await service.run();
    res.json({ ok: true });
  } catch (err) { next(err); }
});