2015-10-14 13 views
7

Sto tentando di distribuire un progetto che ho ereditato su heroku utilizzando grunt buildcontrol per la prima volta. Anche se sono in grado di costruire e distribuire, a correre ottengo un errore:Impossibile aprire il file chiave SSL nel server Node - ENOENT

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

Controllo della directory dist, infatti non esiste una directory ssl. Così, l'ho aggiunto a/dist senza alcun risultato. Pensando che app.js all'interno di/dist/server/potrebbe essere circoscritto a quella directory, ho copiato la directory ssl lì - di nuovo lo stesso problema. All'interno di /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); 

Dove sta andando a cercare la directory SSL se non all'interno della cartella del server?

risposta

7

La funzione readFileSyncevaluates relative paths to the current working directory del nodo eseguibile, che su Heroku è /app, non sulla cartella dist. Per accedere alla cartella dist come percorso relativo, si dovrebbe utilizzare path.resolve:

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')) 
}; 

alternative includono:

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

Ma mi sento che path.resolve è giusto t miscela di concisa e robusta.

0

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

Quando si accede __dirname in app.js otterrete /dist/server.

Hai memorizzato la directory ssl in /dist/server.

Così, il vostro percorso key è /dist/server/ssl/keys/server.key e il vostro percorso cert è /dist/server/ssl/keys/server.crt

si codice dovrebbe essere:

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

Se si memorizzano ssl directory in /dist:

vostro percorso key è /dist/ssl/keys/server.key e il tuo percorso cert è /dist/ssl/keys/server.crt

Ora, il codice dovrebbe essere:

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

sto usando lo stesso su uno dei miei progetti e funziona benissimo senza usare path.resolve o path.join. Anche la rappresentazione della directory principale ../ viene risolta dallo stesso fs.readFileSync.

1

È possibile utilizzare la variabile "__dirname" per accedere al percorso della directory della propria app, se si dispone dell'app.js accanto alla tua cartella dist dove ci sono i/ssl/keys sarà simile a questi:

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); 
Problemi correlati