Web & Application Development

Node.js development

Node earns its place when a service is I/O-heavy or needs to hold open connections, real-time dashboards, chat, webhook processing, streaming responses from an upstream API. It is also the pragmatic choice when the team already writes JavaScript and a second language would just add friction.

The part that catches people out is not writing the code, it is running it. An unsupervised Node process that exits on an unhandled rejection, no log rotation, and no memory ceiling will take a site down at 3am. Production Node is as much an ops job as a development one.

What is included

The work itself

HTTP services

REST APIs with Express or Fastify, or NestJS when the project is large enough to benefit from its structure and dependency injection.

Real-time features

WebSockets via Socket.IO or the ws library, with a Redis adapter so it still works once there is more than one process.

Background work

Job queues with BullMQ, retry and backoff policies, dead-letter handling, and scheduled tasks that do not silently stop.

Data layer

Prisma or Drizzle for typed database access, connection pooling that matches the database limits, and migrations kept in version control.

Production hardening

PM2 or systemd supervision, graceful shutdown on SIGTERM, structured logging with Pino, health endpoints, and memory limits.

TypeScript

Typed end to end where it earns its keep, request/response shapes, database models and shared contracts between frontend and backend.

How I work on it

Process

Adjusted to the job, but this is the shape it usually takes.

  1. Decide what Node is for

    If the workload is CPU-bound batch processing, Node is often the wrong tool and I will say so early.

  2. Define the contract

    API shape and error format agreed up front, documented with OpenAPI so the frontend can build against it in parallel.

  3. Build with the failure cases

    Timeouts, retries and circuit breaking on every outbound call. Third-party APIs go down; the service should degrade rather than hang.

  4. Ship with supervision

    Nothing goes live without process management, log rotation and a restart policy.

Questions

Things people ask

systemd if the box is yours and you want one supervision mechanism for everything on it. PM2 when you need clustering, zero-downtime reloads and per-app log handling without writing unit files. Both are fine; running neither is not.

Yes, though I will ask what problem it is solving. GraphQL is a good fit when many different clients need different shapes of the same data. For a single frontend, REST with well-chosen endpoints is usually less machinery for the same result.

Yes, and it is a common setup, nginx or Apache in front, PHP-FPM handling the main site, Node running on an internal port behind a reverse proxy for the API or real-time piece.

Need help with node.js development?

Tell me the situation and what you have already tried. I read the code and the server before quoting anything.

Get in touch