In Node.js, resource intensive operations such as I/O are performed asynchronously, but have a synchronous counterpart (e.g. there exists a
fs.readFile and its counterpart is
fs.readFileSync). Since Node is single-threaded, you should be careful when using synchronous operations, because they will block the entire process.
If a process is blocked by a synchronous operation, the entire execution cycle (including the event loop) is halted. That means other asynchronous code, including events and event handlers, will not run and your program will continue to wait until the single blocking operation has completed.
There are appropriate uses for both synchronous and asynchronous operations, but care must be taken that they are utilized properly.