Node.js uses an event-driven, non-blocking I/O model to handle concurrent requests.
When a request comes to the Node.js server, it is first handled by the event loop. If the request is for some I/O operation like reading from a database, writing to a file, or making an API call, instead of blocking the entire server till the operation completes, this task gets delegated to the system kernel by Node.js.
Node.js continues running other operations while the I/O operation is in progress. It doesn’t wait for the response. Once the I/O operation gets completed, Node.js gets notified with a callback, and it then pushes the result to the client.
This way, Node.js can handle thousands of concurrent requests without creating separate threads for each request, thus making it highly scalable. In contrast to traditional multi-threaded servers which create a separate thread for each request, potentially leading to high memory consumption and other overheads.