Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unable to read a saved file in heroku

Tags:

node.js

heroku

I am using NodeJS on heroku.

I read a file from another server and save it into my application in the /temp directory. Next, I read the same file to pass it on to my client.

The code that saves the file and then subsequently reads it is:

http.request(options, function (pdfResponse) {
    var filename = Math.random().toString(36).slice(2) + '.pdf',
        filepath = nodePath.join(process.cwd(),'temp/' + filename);

    pdfResponse.on('end', function () {
        fs.readFile(filepath, function (err, contents) {
            //Stuff to do after reading
        });
    });

    //Read the response and save it directly into a file
    pdfResponse.pipe(fs.createWriteStream(filepath));
});

This works well on my localhost.

However, when deployed to heroku, I get the following error:

events.js:72
throw er; // Unhandled 'error' event
Error: ENOENT, open '/app/temp/nvks0626yjf0qkt9.pdf'
Process exited with status 8
State changed from up to crashed

I am using process.cwd() to ensure that the path is correctly used. But even then it did not help. As per the heroku documentation, I am free to create files in the applications directory, which I am doing. But I can't figure out why this is failing to read the file...

like image 378
callmekatootie Avatar asked Mar 26 '14 14:03

callmekatootie


1 Answers

The error you describe there is consistent with /app/temp/ not existing. You need to create it before you start writing in it. The idea is:

var fs = require("fs");
var path = require("path");
var temp_dir = path.join(process.cwd(), 'temp/');

if (!fs.existsSync(temp_dir))
    fs.mkdirSync(temp_dir);

I've used the sync version of the calls for illustrations purposes only. This code should be part of the start up code for your app (instead of being called for each request) and how you should structure it depends on your specific application.

like image 193
Louis Avatar answered Oct 09 '22 12:10

Louis