node.js Socket hang up error while streaming an MP4 file from S3

I have an MP4 file sitting in an AWS S3 bucket.

The view code is like this:

<video width="300px" controls>
<source src="/getS3File/<full-s3-filename-here>" type="video/mp4">
</video>

and the backend Node.JS code is like this:

exports.gets3file =  function(req, res, next) {
    var env = require("./env.js");
    var knox = require('knox');
    var s3filename = req.params.id;

    var submissionFileId = "https://TestS3File.amazonws.com/" + s3filename;  

    var s3Client = knox.createClient({
            key: aws.accessKey,
            secret: aws.secretKey,
            bucket: "testbucket"
    });

    s3Client.get(submissionFileId)
    .on('response', function(res) {    
        res.setHeader('Content-Length', res.headers['content-length']);
        res.setHeader('Content-Type', res.headers['content-type']);

        if (req.fresh) {
        res.statusCode = 304;
        res.end();
        return;
        }

        if (req.method === 'HEAD') {
        res.statusCode = 200;
        res.end();
        return;
        }

        res.pipe(req);
    });
    res.end();
    };

When i execute this code, I see this error in the node log:

Error: socket hang up
at createHangUpError (http.js:1472:15)
at CleartextStream.socketOnEnd [as onend] (http.js:1568:23)
at CleartextStream.onCryptoStreamEnd (tls.js:322:24)
at CleartextStream.g (events.js:180:16)
at CleartextStream.emit (events.js:117:20)
at _stream_readable.js:943:16
at process._tickCallback (node.js:419:13)
at process._tickFromSpinner (node.js:394:15

Any ideas re: what I might be doing wrong ?

Thanks

There's a few things wrong here: You're piping to the wrong stream, you're ending your response immediately before the file starts streaming, and you're shadowing the real res with the res from the S3 request. Try something like this instead:

exports.gets3file =  function(req, res, next) {
  var env = require("./env.js");
  var knox = require('knox');
  var s3filename = req.params.id;

  var submissionFileId = "https://TestS3File.amazonws.com/" + s3filename;  

  var s3Client = knox.createClient({
    key: aws.accessKey,
    secret: aws.secretKey,
    bucket: "testbucket"
  });

  s3Client.get(submissionFileId)
  .on('response', function(s3res) {
    res.setHeader('Content-Length', s3res.headers['content-length']);
    res.setHeader('Content-Type', s3res.headers['content-type']);

    if (req.fresh) {
      res.statusCode = 304;
      res.end();
      return;
    }

    if (req.method === 'HEAD') {
      res.statusCode = 200;
      res.end();
      return;
    }

    s3res.pipe(res);
  }).end();
};

You may want to also check s3res.statusCode too in case the file doesn't exist (404) for example, so that you can send the appropriate status code back to the original client.