I'm attempting to deploy a project I inherited to heroku using grunt buildcontrol for the first time. Though I am able to build and deploy, on running I get an error:
ENOENT: no such file or directory, open 'ssl/keys/server.key'
Checking the dist directory, indeed there is no ssl directory. Thusly, I've added it to /dist to no avail. Thinking that app.js inside of /dist/server/ might be scoped to that directory, I copied the ssl directory there - again the same issue. Inside of /dist/server/app.js:
var options = {
key: fs.readFileSync('ssl/keys/server.key'),
cert: fs.readFileSync('ssl/keys/server.crt')
};
// Setup server
var app = express();
var server = require('https').createServer(options, app);
Where is it going to look for the ssl directory if not inside the server folder?
The
readFileSync
function evaluates relative paths to the current working directory of the node executable, which on Heroku is/app
, not the dist folder. To access your dist folder as a relative path, you should be usingpath.resolve
:Alternatives include:
fs.readFileSync(__dirName + '/dist/ssl/keys/server.key')
fs.readFileSync(process.cwd() + '/dist/ssl/keys/server.key')
fs.readFileSync(path.join(__dirName, 'dist', 'ssl', 'keys', 'server.key'))
But I feel that
path.resolve
is right blend of concise and robust.