Catching Fatal Errors with Node.js child_process

By  on  

I'm relatively new to hardcore Node.js hacking so I'm seeing all sorts of lovely new errors that I have no clue how to solve when I initially see them.  To this point I've managed to keep a smile on my face while trying to fix these errors, a quality I quite enjoy about myself.  One of the recent errors I encountered was with child_process, whereby an error would occur within an execSync command and the entire app would brick; not even  a try/catch would save me.  I did find a solution, however.

The JavaScript

The best way to catch errors without letting your app brick is by using the process' spawn (or in this case spawnSync) method:

var childProcess = require('child_process');

var commitMessage = (function() {
	var spawn = childProcess.spawnSync('git', ['log', '--format=%B', '-n', '1']);
	var errorText = spawn.stderr.toString().trim();

	if (errorText) {
	  console.log('Fatal error from `git log`.  You must have one commit before deploying.');
	  throw new Error(errorText);
	}
	else {
	  return spawn.stdout.toString().trim();
	}
})();

With this method you can check the stderr buffer first; if there's a String from it you know it errored out, if no error text then the process was clean!

Recent Features

  • By
    9 Mind-Blowing Canvas Demos

    The <canvas> element has been a revelation for the visual experts among our ranks.  Canvas provides the means for incredible and efficient animations with the added bonus of no Flash; these developers can flash their awesome JavaScript skills instead.  Here are nine unbelievable canvas demos that...

  • By
    I&#8217;m an Impostor

    This is the hardest thing I've ever had to write, much less admit to myself.  I've written resignation letters from jobs I've loved, I've ended relationships, I've failed at a host of tasks, and let myself down in my life.  All of those feelings were very...

Incredible Demos

  • By
    dwProgressBar v2:  Stepping and Events

    dwProgressBar was a huge hit when it debuted. For those of you who didn't catch my first post, dwProgressBar is a MooTools 1.2-based progress bar which allows for as much flexibility as possible. Every piece of dwProgressBar can be controlled by CSS...

  • By
    Create WordPress Page Templates with Custom Queries

    One of my main goals with the redesign was to make it easier for visitors to find the information that was most popular on my site. Not to my surprise, posts about MooTools, jQuery, and CSS were at the top of the list. What...

Discussion

  1. there is also a spawn.status property that holds the exit code. A check for spawn.status !== 0 might be more reliable in cases when there no error message…

  2. eliranmal

    also, spawn.stderr.toString() is not safe, as stderr may be undefined.
    you’re better off just wrapping it with the String constructor:

    String(spawn.stderr)
  3. caoyy

    Perhaps it is more elegant to use status to judge whether the execution was successful or not.

    const childProcess = require('child_process');
    
    var result = (() => {
      const { stderr, stdout, status } = childProcess.spawnSync('npm', ['install']);
    
      if (status !== 0) {
        const errorText = stderr.toString();
        console.log('Fatal error from npm install.');
    
        throw new Error(errorText);
      }
      return stdout.toString();
    })();
    

Wrap your code in <pre class="{language}"></pre> tags, link to a GitHub gist, JSFiddle fiddle, or CodePen pen to embed!