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
    fetch API

    One of the worst kept secrets about AJAX on the web is that the underlying API for it, XMLHttpRequest, wasn't really made for what we've been using it for.  We've done well to create elegant APIs around XHR but we know we can do better.  Our effort to...

  • By
    5 Ways that CSS and JavaScript Interact That You May Not Know About

    CSS and JavaScript:  the lines seemingly get blurred by each browser release.  They have always done a very different job but in the end they are both front-end technologies so they need do need to work closely.  We have our .js files and our .css, but...

Incredible Demos

  • By
    Fade Images with MooTools LazyLoad

    I recently received an email from a MooTools developer asking a great question about my LazyLoad class: "I'm using your LazyLoad MooTools plugin (which is great, by the way). I have been trying to figure out how to modify it so that once an image scrolls into...

  • By
    Google-Style Element Fading Using MooTools or jQuery

    Google recently introduced an interesting effect to their homepage: the top left and top right navigation items don't display until you move your mouse or leave the search term box. Why? I can only speculate that they want their homepage as...

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!