You mix the argument offset and position. From the docs :
offset is the offset in the buffer to start writing to.
position - an integer that determines where to start reading from a file. If the position is zero, the data will be read from the current file position.
You should change your code to this:
fs.read(fd, buffer, 0, contentLength, start, function(err, num) { console.log(buffer.toString('utf-8', 0, num)); });
Basically, offset will be the index that fs.read will write to the buffer. Say you have a buffer of length 10 like this: <Buffer 01 02 03 04 05 06 07 08 09 0a> and you will read from /dev/zero , which is basically just zeros, and set the offset to 3 and set the length to 4 then you will receive the following: <Buffer 01 02 03 00 00 00 00 08 09 0a> .
fs.open('/dev/zero', 'r', function(status, fd) { if (status) { console.log(status.message); return; } var buffer = new Buffer([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]); fs.read(fd, buffer, 3, 4, 0, function(err, num) { console.log(buffer); }); });
Also, to do what you could try using fs.createStream :
app.post('/random', function(req, res) { var start = req.body.start; var fileName = './npm'; var contentLength = req.body.contentlength; fs.createReadStream(fileName, { start : start, end: contentLength - 1 }) .pipe(res); });