Node.js is single-threaded for the execution of your JavaScript code, but it is multi-threaded at the system and runtime level.
All your application's JavaScript code runs on a single main thread called the Event Loop.
Non-Blocking: Because it is single-threaded, Node.js uses asynchronous, non-blocking I/O to handle thousands of concurrent connections without the overhead of creating a new thread for every request
Libuv Thread Pool: Node.js uses a C++ library called libuv, which maintains a default pool of 4 background threads (configurable via UV_THREADPOOL_SIZE).
Internal Tasks: These background threads handle intensive operations that would otherwise block the main thread, such as File System (I/O) operations, Cryptographic functions (e.g., hashing), Compression (Zlib), DNS lookups.
V8 Engine Threads: The V8 engine itself uses separate threads for tasks like garbage collection.