25

I built a simple server that handled errors (files that aren't found, for example) which works fine:

    fs.readFile(fullPath, function(err, data) {

        // If there is an error, return 404
        if (err) {
            res.writeHead(404);
            res.end();
            debug.log("File denied: " + fullPath);
        } else {
            var length      = data.length;
            var extension   = getExtension(path);
            var type        = getType(extension);

            // If the type doesn't match a MIME type that this app serves, return 404
            if (!type) {
                res.writeHead(404);
                res.end();
                debug.log("File denied: " + fullPath);

            // Otherwise, serve the file
            } else {
                res.writeHead(200, {
                    'Content-Length' : length,
                    'Content-Type' : type
                });
                res.write(data);
                res.end();
                debug.log("File served: " + fullPath);
            }
        }
    });

But I decided that I want to support compression, so I need to use fs.createReadStream() to read the file, like in this example that I'm looking at:

//Check request headers
var acceptEncoding = req.headers['accept-encoding'];
if (!acceptEncoding) {
    acceptEncoding = '';
}

var raw = fs.createReadStream(fullPath);

// Note: this is not a conformant accept-encoding parser.
// See http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.3
if (acceptEncoding.match(/\bdeflate\b/)) {
    response.writeHead(200, { 'content-encoding': 'deflate' });
    raw.pipe(zlib.createDeflate()).pipe(response);
} else if (acceptEncoding.match(/\bgzip\b/)) {
    response.writeHead(200, { 'content-encoding': 'gzip' });
    raw.pipe(zlib.createGzip()).pipe(response);
} else {
    response.writeHead(200, {});
    raw.pipe(response);
}

So my problem is that I'm trying to figure out how to incorporate my error handling into the stream approach since fs.createReadStream() doesn't take a callback function.

How do I handle errors for Node.js fs.createReadStream()?

1 Answer 1

29

Streams can emit an error event. You can listen for this event to prevent the default behavior of throwing the error:

raw.on('error', function(err) {
  // do something with `err`
});
Sign up to request clarification or add additional context in comments.

2 Comments

Cool, I was thinking of something like that but didn't see it in the docs.
Here is the link to the readable stream error event doc.

Your Answer

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