2015-10-14 7 views
7

Ich versuche, ein Projekt, das ich geerbt habe, mit grunt buildcontrol zum ersten Mal in heroku zu implementieren. Obwohl ich in der Lage bin zu bauen und zu implementieren, auf Laufen bekomme ich einen Fehler:SSL-Schlüsseldatei kann nicht im Knotenserver geöffnet werden - ENOENT

ENOENT: no such file or directory, open 'ssl/keys/server.key'

das dist-Verzeichnis prüfen, in der Tat kein ssl ist. Daher habe ich es/dist vergebens hinzugefügt. Wenn ich bedenke, dass app.js innerhalb von/dist/server/auf dieses Verzeichnis beschränkt ist, habe ich dort das ssl-Verzeichnis kopiert - wieder das gleiche Problem. Innerhalb von /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); 

Wohin geht es für das ssl-Verzeichnis zu suchen, wenn nicht im Server-Ordner?

Antwort

7

Die readFileSync Funktion evaluates relative paths to the current working directory des Knotens ausführbare, die auf Heroku ist /app, nicht der Ordner dist. Um Ihre dist-Ordner als relativer Pfad zugreifen, sollten Sie path.resolve werden:

var path = require('path'); 
var options = { 
    key: fs.readFileSync(path.resolve('dist/ssl/keys/server.key')), 
    cert: fs.readFileSync(path.resolve('dist/ssl/keys/server.crt')) 
}; 

Alternativen sind:

  • 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'))

Aber ich fühle mich dass path.resolve ist richtig Die Mischung aus prägnant und robust.

0

Thinking that app.js inside of /dist/server/ might be scoped to that directory, I copied the ssl directory there.

Wenn Sie __dirname in app.js einloggen werden Sie /dist/server bekommen.

Sie haben Ihr Verzeichnis ssl in /dist/server gespeichert.

Also, Ihr key Weg ist /dist/server/ssl/keys/server.key und Ihre cert Weg ist /dist/server/ssl/keys/server.crt

sollten Sie Code sein:

var options = { 
    key: fs.readFileSync(__dirname + '/ssl/keys/server.key'), 
    cert: fs.readFileSync(__dirname + '/ssl/keys/server.crt') 
}; 

Wenn Sie speichern ssl Verzeichnis in /dist:

Ihre key Weg ist /dist/ssl/keys/server.key und Ihr cert Pfad ist /dist/ssl/keys/server.crt

Code Jetzt sollte sein:

var options = { 
    key: fs.readFileSync(__dirname + '/../ssl/keys/server.key'), 
    cert: fs.readFileSync(__dirname + '/../ssl/keys/server.crt') 
}; 

ich das gleiche auf einem meines Projekt verwenden und es funktioniert gut, ohne path.resolve oder path.join zu verwenden. Selbst die ../ übergeordnete Verzeichnisdarstellung wird durch fs.readFileSync selbst aufgelöst.

1

Sie können die Variable "__dirname" verwenden, um auf den Verzeichnispfad Ihrer App zuzugreifen, wenn Sie über die App verfügen.js neben Ihrem dist Ordner, wo die/ssl/keys sind, wird es so aussehen:

var options = { 
    key: fs.readFileSync(__dirname + '/dist/ssl/keys/server.key'), 
    cert: fs.readFileSync(__dirname + '/dist/ssl/keys/server.crt') 
}; 

// Setup server 
var app = express(); 
var server = require('https').createServer(options, app); 
Verwandte Themen