Got a programming interview coming up? Preparing for it is as important as developing your coding knowledge to ace it. It’ll give you the confidence to handle the interview and shake off the jitters. This is especially true if you are facing a programming interview for the first time in your life.
To help Node.js developers achieve the necessary preparedness for an interview, I have put together a list of 15 commonly asked Node.js- and web development-related interview questions. These questions and their answers will also prompt you to brush up on any areas you feel need improvement before the big interview.
Right now, let’s dive in to see the Node-related questions you are likely to field in your next interview.
When should you use Node.js?
Node.js is asynchronous, event-driven, non-blocking, and single-threaded. It makes Node a perfect candidate for developing the following types of applications:
- Realtime applications like chat and services delivering live updates.
- Streaming applications that deliver video or other multimedia content to a large audience.
- I/O intensive applications, like collaborative platforms.
- Web backends that follow microservices architecture.
However, Node.js’ unique qualities make it less than ideal for some other types of applications: those that carry out CPU-intensive tasks like complex mathematical computations will be restricted by Node’s single-threaded execution.
If you want to learn more about this, check out our article on Node.js architecture and when to use Node.js in projects.
What does EventEmitter do?
Every object in Node.js capable of emitting events is a member of the
EventEmitter class. The
http module is one such example.
EventEmitter classes can use the
eventEmitter.on() function to attach event listeners to the event. Then, as soon as such an event is caught, its listeners are called one by one synchronously.
What is Node’s event loop?
Since Node.js is single-threaded, it has to be non-blocking to prevent the thread from spending too long on a task that takes a while to complete. The event loop is responsible for enabling this non-blocking behavior. Its job is to schedule pending tasks using the application thread.
We know that Node uses callbacks to handle the response returned by an asynchronous function when its task is complete. Similar to the event that created the task, the completion of the task also emits an event. Node.js adds these events that require handling to an event queue.
The event loop iterates over events in the event queue and schedules when to execute their associated callback functions.
What are Node Streams?
Streams are pipelines that read or write data from a source and transfer it to a continuous flow destination. There are four types of streams:
- Duplex (both readable and writable)
- Transform (A type of duplex stream. Its output is calculated using the input)
Each stream is also an
EventEmitter. It means a stream object can emit events when there is no data on the stream, when data is available on the stream, or when data in the stream is flushed from the program.
What is the difference between readFile and createReadStream functions?
readFile function reads the entire content of the file asynchronously and stores it in the memory before passing it to the user.
createReadStream uses a readable stream that would read the file chunk by chunk without storing the entirety of it into the memory.
createReadStream optimizes the file reading operation compared to
readFile by using less memory and making it faster. If the file is of considerable size, the user doesn’t have to wait a long time until its entire content is available, because small chunks are sent to the user as they are read.
How do you handle uncaught exceptions in Node.js?
We can catch uncaught exceptions thrown in the application at its process level. We attach a listener to the
process global object to catch such events.
Can Node take full advantage of a multi-processor system?
Node applications are always single-threaded. So, naturally, the application uses only a single processor even when running on multi-processor systems.
But one of Node’s core modules, Cluster, provides support for Node applications to take advantage of multiple cores. It allows us to create multiple worker processes that can run on several cores in parallel, and share a single port to listen to events.
Here, each process uses IPC to communicate with the main thread and pass the server handle to others as needed. The main process can either listen to the port itself and pass every new connection to child processes in a round robin order, or assign the port to child processes so the child processes listen to requests.
What is the reactor design pattern used in Node.js?
The reactor pattern is used for maintaining non-blocking I/O operations in Node.js. It attaches a callback function (a handler) to each I/O operation. The handler is then submitted to a demultiplexer at the time of request creation.
Demultiplexer collects every I/O request made in the application and queues them as events in a queue. This is what we call the event queue. After queuing the event, the demultiplexer returns the control of the application thread.
Meanwhile, the event loop iterates over each event in the event queue, and invokes the attached callback to handle the event response.
This is the reactor pattern used by Node.js.
What are the benefits of a single-threaded web backend to a multi-threaded one?
Put another way: though Node is single-threaded, most of the programming languages used for backend development provides multiple threads to handle application operations. In what way is having only a single thread is beneficial to backend development?
- It’s easier for developers to implement applications. Our applications have no risk of running into unexpected race conditions suddenly while in production.
- Single-threaded applications are easily scalable.
- They can serve a large number of user requests received at a moment without much delay. In comparison, a multi-threaded backend has to wait for a thread from the thread pool to be free to serve the user request when traffic is high. With Node’s non-blocking nature, there’s no risk of a user request hanging on to the single thread for too long (this is true only when the operations are not CPU-intensive).
What is REPL in Node?
The callback passed to the setImmediate function is executed in the next iteration of the event loop over the event queue.
On the other hand, the callback passed to the
process.nextTick is executed before the next iteration of the event loop, and after the operation currently running in the program is finished. At the application start, its callback is called before the event loop starts iterating over the event queue.
process.nextTick callback is always called before the
What are stubs?
Stubs are used when testing applications. They simulate the behavior of a given component or a module so that you can focus on just the part of the code you want to test. By using stubs in place of components irrelevant to the test, you won’t have to worry about external components impacting the results.
For example, if the component you are testing has a file reading operation before the part you expect to test, you can use a stub to simulate that behavior and return mock content without actually reading the file.
In Node, we use libraries like Sinon for this purpose.
Why is it a good practice to separate ‘app’ and ‘server’ in Express?
By separating app and server in Express, we can separate the API implementation from the network-related configuration. This allows us to carry out API tests without performing network calls. This also guarantees faster test execution and better code coverage metrics.
To achieve this separation, you should declare API and server in separate files. Here we use two files:
What are yarn and npm? Why would you want to use yarn over npm?
npm is the default package manager distributed with Node.js. It has a large library of public and private packages stored in a database called ’emp registry’ that users can access via npm’s command-line client. With the help of npm, users can easily manage dependencies used in a project.
yarn is also a package manager that was released as an answer to some of npm’s shortcomings. However, yarn relies on the npm registry to provide users access to packages. Since yarn’s underlying structure is based on npm itself, your project structure and workflow doesn’t have to go through major changes if you are migrating to yarn from npm.
Like I mentioned before, yarn provides better functionality over npm in some cases. Unlike npm, it caches every package you download, so you don’t have to redownload it whenever needed.
It also provides better security by verifying the integrity of packages using checksums. It guarantees a package that worked on a certain system will work exactly the same way in any other system.
In this post, we went through 15 of the most commonly asked Node.js interview questions to help you prepare better for your next interview. Knowing what type of questions you are likely to get asked and knowing their answers will give you the confidence to answer interview questions without feeling nervous.
This article was originally published on Live Code Stream by Juan Cruz Martinez (Twitter: @bajcmartinez), founder and publisher of Live Code Stream, entrepreneur, developer, author, speaker, and doer of things.
Live Code Stream is also available as a free weekly newsletter. Sign up for updates on everything related to programming, AI, and computer science in general.