How do I debug “Error: spawn ENOENT” on node.js?

后端 未结 25 2745
轻奢々
轻奢々 2020-11-22 03:00

When I get the following error:

events.js:72
        throw er; // Unhandled \'error\' event
              ^
Error: spawn ENOENT
    at errnoException (chil         


        
25条回答
  •  别那么骄傲
    2020-11-22 03:45

    NOTE: This error is almost always caused because the command does not exist, because the working directory does not exist, or from a windows-only bug.

    I found a particular easy way to get the idea of the root cause of:

    Error: spawn ENOENT
    

    The problem of this error is, there is really little information in the error message to tell you where the call site is, i.e. which executable/command is not found, especially when you have a large code base where there are a lot of spawn calls. On the other hand, if we know the exact command that cause the error then we can follow @laconbass' answer to fix the problem.

    I found a very easy way to spot which command cause the problem rather than adding event listeners everywhere in your code as suggested in @laconbass' answer. The key idea is to wrap the original spawn call with a wrapper which prints the arguments send to the spawn call.

    Here is the wrapper function, put it at the top of the index.js or whatever your server's starting script.

    (function() {
        var childProcess = require("child_process");
        var oldSpawn = childProcess.spawn;
        function mySpawn() {
            console.log('spawn called');
            console.log(arguments);
            var result = oldSpawn.apply(this, arguments);
            return result;
        }
        childProcess.spawn = mySpawn;
    })();
    

    Then the next time you run your application, before the uncaught exception's message you will see something like that:

    spawn called
    { '0': 'hg',
      '1': [],
      '2':
       { cwd: '/* omitted */',
         env: { IP: '0.0.0.0' },
         args: [] } }
    

    In this way you can easily know which command actually is executed and then you can find out why nodejs cannot find the executable to fix the problem.

提交回复
热议问题