Backend

NestJS vs Express: why we choose a framework with architecture

23 May 2024 · 8 min read · SmartCG

The end of spaghetti backends: what dependency injection and a strict structure actually buy you.

The Express problem

Express is an excellent minimal tool. But once a project grows past fifty routes, chaos begins: every developer writes controllers in their own style, logic is smeared across middleware, and testing becomes painful. Nothing in the framework says where business logic belongs — so every team invents its own answer.

What NestJS changes

NestJS solves the main Node.js problem: the absence of an out-of-the-box architecture. Inspired by Angular, it offers:

  • Modules: features are isolated, with explicit dependencies between them.
  • Dependency injection: classes receive their dependencies in the constructor instead of creating them. That makes code testable with mocks and keeps wiring in one place.
  • Decorators: @Get(), @UseGuards() make routing and access rules readable and declarative.

When Express is still fine

For a small service, a webhook receiver or a prototype, Express (or Fastify) is lighter and faster to start. The switch to NestJS pays off when more than one team touches the backend, when access rules and validation must be consistent, and when onboarding a new developer should take days rather than weeks.

The real difference

It is not performance — both are fast enough for B2B workloads. It is the cost of the tenth developer joining the project. A framework with enforced structure makes that cost predictable.

Services involved

Read next

Backend has outgrown Express and the team is tired of improvisation?

We help define a mature backend contour: modules, ownership, release discipline and a clear plan that does not depend on one person's memory.