LogoLogo
  • 👋Cal.com Handbook
  • The Company
    • ❓What is Cal.com?
    • 📈Mission, Vision and Values
    • 🅰️Glossary
    • 📈Organization Chart
  • HR & Careers
    • 👷Contract-to-hire trials
    • 🛫Onboarding
    • 🏆IC Levels
      • ⛰️Engineering Levels
        • 🕵️IC1 Engineer (Code Cadet)
        • 👷‍♀️IC2 Engineer (Code Craftsperson)
        • 🧘‍♀️IC3 Engineer (Code Connoisseur)
        • 🧙‍♂️IC4 Engineer (Code Wizard)
    • 💡Sharing your views
    • 💸Bonus & Equity Structure
  • Policies
    • 🏖️Vacations
    • 💳Expenses
    • 🗣️Communications
  • Engineering
    • 🔔Managing Notifications
    • ⭐Valuable Bookmarks
    • 🐛How to report issues
    • 💻How we work on Tickets
    • 🔥What to do during Emergencies
    • ✅PR Reviews
    • ☑️Self-reviews
    • 📚Keeping Docs up-to-date
    • 🌐HTTPS & Subdomains
    • 🎯Best practices
      • Data fetching
      • Avoid Prop Drilling
      • Prefer defaultHandler for simple API handlers
      • Prefer inferred types over explicit ones
      • Prefer early returns
      • Avoid comparing multiple values with `includes`
      • Validate using zod instead of type casting
      • Prefer Composition over Prop Drilling
      • Prefer ternaries over Short Circuiting “&&” for React Components
      • Don't modularize prematurely
      • Only select data you need
      • Disallowing the use of unrestricted Metadata fields
      • E2E Tests Best Practices
    • 💻Codebase
      • 🔓Keeping the lock file in sync
      • 🚫Git Private Submodules
      • 🏎️Monorepo / Turborepo
      • 🌝Deploying to Production
      • ☁️Deployment
      • 💻Debug Desktop App
      • 🚩Enabling/Disabling Features
    • 🔺Resolving failed migration on Vercel Preview
    • 🔦Cal.com Status Page
  • Customer Success
    • 💟Tone
  • Marketing
    • 🎬Media
    • ☝️How to add a new Tip to Sidebar
  • 🤲Sales
    • Operations Stack
Powered by GitBook
On this page

Was this helpful?

  1. Engineering
  2. Best practices

Prefer defaultHandler for simple API handlers

Instead of checking for each method:

export default async function handler(req: NextApiRequest, res: NextApiResponse) {
   if (req.method === "GET") {
    res.status(202).json({ message: "getting something" });
  }
  if (req.method === "POST") {
    res.status(202).json({ message: "posting something" });
  }
  if (req.method === "PATCH") {
    res.status(202).json({ message: "patching something" });
  }
}

Prefer splitting each method logic in their own files and use defaultHandler to auto-handle missing methods. And keep legibility when checking for individual method logic.

// _get.ts
import { defaultResponder } from "@calcom/lib/server";

async function getHandler(req: NextApiRequest, res: NextApiResponse) {
  req.statusCode = 200;
  return { message: "getting something" };
}

export default defaultResponder(getHandler);


// _post.ts
import { defaultResponder } from "@calcom/lib/server";

async function postHandler(req: NextApiRequest, res: NextApiResponse) {
  req.statusCode = 200;
  return { message: "posting something" };
}

export default defaultResponder(postHandler);


// _patch.ts
import { defaultResponder } from "@calcom/lib/server";

async function patchHandler(req: NextApiRequest, res: NextApiResponse) {
  req.statusCode = 200;
  return { message: "patching something" };
}

export default defaultResponder(patchHandler);


// index.ts
import { defaultHandler } from "@calcom/lib/server";

export default defaultHandler({
  GET: import("./_get"),
  POST: import("./_post"),
  PATCH: import("./_patch"),
});

If you have only one method, splitting in files may be overkill. Instead you can keep all in one file but still benefit from auto-method handling by doing the following to comply with the TS signature.

import { defaultHandler, defaultResponder } from "@calcom/lib/server";

async function getHandler(req: NextApiRequest, res: NextApiResponse) {
  req.statusCode = 200;
  return { message: "getting something" };
}

export default defaultHandler({
  GET: Promise.resolve({ default: getHandler }),
});
PreviousAvoid Prop DrillingNextPrefer inferred types over explicit ones

Last updated 2 years ago

Was this helpful?

🎯