Supercharge your debugging experience for Node.js

Supercharge your debugging experience for Node.js

  • 2019-02-21 02:56 AM
  • 152

Read 'Supercharge your debugging experience for Node.js' and feel free to discuss the same with the programming community. Read what other developers

Debugging server-side javascript code with console logs is archaic.

Console logs just simply aren’t enough since it requires us to go line by line in a very slow manner whilst restarting our server each time. Console logs also clutter our codebase with unnecessary code and removing them requires small effort.

Exhibit A: How much energy does it take to spot the console log among the dummy data and other processes?

Very daunting. It doesn’t have to be this way.

A much more efficient way of doing things would be debugging with breakpoints. With breakpoints, we can step over the call stack and event loop to diagnose the problem.

You get the point. Time to explore other options. What are the options? I’m glad you asked!

By the way, there’s a very tasty treat at the end of the article — just saying.

Node has a built-in inspector!

Yes, that’s right. Node actually has a built-in inspector. The inspector uses the v8 debugger protocol viewer under the hood.

Let me show you — let’s start a new node project.
init.sh

mkdir node-debugging && cd node-debugging && npm init -y  && npm install express nodemon && touch server.js

server.js

const express = require('express');

const app = express();

app.listen(3000, () => {
	console.log('listening on port 3000');
});

app.get('/', (req, res) => {
	res.status(200).send('<h1>hi</h1>');
});

Now we have a basic express server. But instead of using the node server.js command the traditional way, we’re adding an extra flag to our node command, the inspector.

--inspect tells Node to expose the new debugging protocol.

initServerWithInspector.sh

node --inspect=0.0.0.0:9229 server.js

Once we start our server with the inspector, here’s what the console outputs.

Sweet, it worked. Open the Chrome at http://localhost:3000 with the dev tools. Notice something extra?

Woot, node inside our browser? Yes indeed! We still consume our app like before — localhost:3000

[http://0.0.0.0:9229/](http://0.0.0.0:9229/) port is for the DevTools to consume.

What does Node Inspector do?

Node Inspector lets you use the DevTools user interface with the native Node debugger. DevTools can now connect directly to the Node process!

If you know how to get this working on Firefox or Safari, let us know in the comments/discussion.

Using the debugger

Using the chrome debugger is very much the same as using the debugger for client-side code. You set breakpoints, execute the code, step over the breakpoints and find the bug.

Can you imagine how useful this can be when we have an error inside a big controller? We have access to the debugger, call stack, scopes, local variables, global variables, etc. We have so many sharp tools to use!

Taking it to another level

We’re not done yet. 20 July 2018 was a very special day for debugging node. Why?

Google Chrome labs team open sourced their advanced debugging tool — ndb!

Ndb is a sweet tool for debugging. Let’s give it a go.

Installing ndb

npm install -g ndb

It’s like any other npm package, very simple to use and install.

Usage

To use ndb, we just have to prefix our start script with ndb.

That’s all! Let’s restart our server — notice we’re using nodemon — just like any traditional project.

Woot! We have a new chrome instance for the sole purpose of debugging. How cool is that? Epic!

We even have access to the node [process](https://nodejs.org/api/process.html) global object — which is the window object for node.

Hacker news discussion about the new debugger — check it out!

Thanks for reading, stay awesome!

Learn more

Angular & NodeJS - The MEAN Stack Guide

Learn Nodejs by building 12 projects

Angular 2 and NodeJS - The Practical Guide to MEAN Stack 2.0

NodeJS CI/CD with AWS CodePipeline and Mocha - Zero to Hero

Introduction to NodeJS - Learn and Understand JavaScript