EPIPE error in Node.js

rlp picture rlp · Aug 14, 2018 · Viewed 20k times · Source

The following code run fine on JPEG, Docx, zip and several other file formats. Then I try is on mpg-filer however, I am hit by a "Error: write EPIPE" that I am unable to debug. Using a try/catch construction also result in an uncaught exception.

The code:

var fs = require('fs')
const { spawn } = require('child_process')
var file = '/path/to/some/file.jpg'

var rs = fs.createReadStream(file)
const exiftool = spawn('exiftool', ['-json', '-']);
var exif = ''

exiftool.stdout.on('data', function(chunk) {
    exif += chunk
})

exiftool.on('close', function(code) {
    console.log('Sourcefile: %s', JSON.parse(exif)[0].SourceFile)
})

exiftool.on('error', function(error) {
    console.log('exiftool has error: %s', error)
})

rs.pipe(exiftool.stdin)

The error when using mpg-files:

events.js:167
      throw er; // Unhandled 'error' event
      ^

Error: write EPIPE
    at WriteWrap.afterWrite [as oncomplete] (net.js:835:14)
Emitted 'error' event at:
    at Socket.onerror (_stream_readable.js:687:12)
    at Socket.emit (events.js:182:13)
    at onwriteError (_stream_writable.js:431:12)
    at onwrite (_stream_writable.js:456:5)
    at _destroy (internal/streams/destroy.js:40:7)
    at Socket._destroy (net.js:605:3)
    at Socket.destroy (internal/streams/destroy.js:32:8)
    at WriteWrap.afterWrite [as oncomplete] (net.js:837:10)

Answer

Sasha Pomirkovany picture Sasha Pomirkovany · Aug 14, 2018

edit: corrected the code due to issues found in the comments

This kind of error can happen when you try to write to a closed stream

Try/Catch isn't the way to handle stream errors, but you can do it this way:

rs.pipe(exiftool.stdin).on('error', function(e) {
  console.log('rs.pipe has error: ' + e.message)
});