Search code examples
javascriptnode.jspdfloopbackjsstrongloop

Download pdf using remote method


I intend to download a dynamically generated pdf file using a remote method, the file exists at a particular path and I am using return type "file". My implementation is:

customer.downloadFile = function downloadFile(userId, res, cb){
    var reader = fs.createReadStream(__dirname + '/../document.pdf');
    cb(null, reader, 'application/pdf');
};

customer.remoteMethod(
    'downloadFile',
    {
        isStatic: true,
        accepts: [
            { arg: 'id', type: 'string', required: true },
            { arg: 'res', type: 'object', 'http': { source: 'res' } }
        ],
        returns: [
            { arg: 'body', type: 'file', root: true },
            { arg: 'Content-Type', type: 'string', http: { target: 'header' } }
        ],
        http: {path: '/:id/downloadFile', verb: 'get'}
    }
);

The issue with the above code is that the browser although displays the beautiful pdf file container, but instead of the file following error is shown:

enter image description here

Please point out as to what is wrong with the code and how to correct. Got lead from this URL: https://github.com/strongloop/loopback-swagger/issues/34


Solution

  • Got that working with following:

    fs.readFile(fileName, function (err, fileData) {
        res.contentType("application/pdf");
        res.status(200).send(fileData);
    
        if (!err) {
            fs.unlink(fileName);
        }
        else {
            cb(err);
        }
    });