8

I'm trying to run "npm publish" from a gulp task. It works, but I want to handle any error that npm command itself throws.

If I execute this code:

var cmd = spawnSync('npm.cmd', ['publish', packageDir], { stdio: 'inherit' })

cmd.stdout and cmd.stderr are null. If I execute

var cmd = spawnSync('npm.cmd', ['publish', packageDir], { stdio: 'pipe' })

cmd.stdout and cmd.stderr are buffers, like <Buffer 6e 70 6d 20 45 52...

What am I missing here?

1
  • If I do this cmd.stderr.toString(), I can see the error, but cmd,error is still undefined... Commented Oct 20, 2016 at 8:56

2 Answers 2

10

In Node documentation regarding options.stdio it says

By default, the child's stdin, stdout, and stderr are redirected to corresponding subprocess.stdin, subprocess.stdout, and subprocess.stderr.

In your options use

{ stdio: ['inherit', 'inherit', 'pipe'] }

And then check for stderr. An example:

var spawn = childProcess.spawnSync('node myScript.js', { stdio: ['inherit', 'inherit', 'pipe'] })

if (spawn.stderr) {
  console.log(Error(spawn.stderr))
  process.exitCode = 1;
}
Sign up to request clarification or add additional context in comments.

1 Comment

Just a note, process.exit is not recommended. See this SO answer before copy-pasting
2

Fixing some of the issues with a previous answer. Here is how I was able to get it to work properly:

const npmInstall = spawnSync(
  "npm",
  ["install"],
  { stdio: ["inherit", "inherit", "pipe"] }
);

if (npmInstall.stderr.toString().trim()) {
  console.error(`${errorPrefix}${npmInstall.stderr.toString()}`);
} else {
  console.log("NPM Install Complete.");
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.