2017-01-25 5 views
1

Ich habe eine nodejs-Anwendung mit hapi.js und ich versuche, ein Bild von einer URL herunterladen. Heroku gibt mir Fehler mit dem Pfad.Heroku nodejs Pfadproblem ... Fehler: ENOENT: keine solche Datei oder Verzeichnis

Mein Code:

Request(uri).pipe(fs.createWriteStream(__dirname+'/../public/images/'+filename)).on('close', callback); 

Mein Fehler:

Error: ENOENT: no such file or directory, open '/app/../public/images/1430540759757341747_4232065786.jpg' 

Meine Dateistruktur ist einfach:

app.js 
-public 
-images 
    -sampleimage.jpg 
-videos 
    -samplevideo.mp4 
-audio 
    -sampleaudio.wav 

Wie Sie die __dirname für Heroku Anwendung finden kann, ist/app. Ich habe versucht, __dirname + 'alle Arten von pathing ../ ./ etc' und ich habe es auch ohne __dirname versucht.

Ich werde eine Menge dieser Dateien mit ffmpeg und einem Sprachwerkzeug erstellen. Könnte mir jemand erklären, was für ein Problem ich habe? Ist es etwas, das mit dem korrekten Pfadnamen gelöst werden kann, oder sind es meine hapijs-Serverkonfigurationen, die ich konfigurieren muss?

Antwort

1

Sie haben nur den falschen Pfad in Ihrem Projekt.

Auf Heroku können Sie nicht in den Ordner BELOW der Wurzel Ihres Projekts schreiben.

In Ihrem Fall läuft Ihr Code in app.js, die im Ordner "root" Ihres Projekts ist. So

, auf Heroku Dateisystem, das bedeutet, dass Ihr Projekt wie folgt aussieht:

/app 
/app/app.js 
/app/public 
/app/public/images 
... 

Heroku den gesamten Code in einen Ordner app genannt legt.

nun im Code oben eingefügt, Sie zeigen:

Request(uri).pipe(fs.createWriteStream(__dirname+'/../public/images/'+filename)).on('close', callback); 

Wenn dieser Code in Ihre app.js ausgeführt wird, bedeutet dies, dass BACK einen Ordner, indem Sie (zB: ..), Sie versuchen zu schreibe in einen nicht beschreibbaren Teil von Herokus Dateisystem.

Stattdessen möchten Sie schreiben an:

Request(uri).pipe(fs.createWriteStream(__dirname+'/public/images/'+filename)).on('close', callback); 

Dies wird die korrekte Schreibweise Ihrer Datei schreiben in die Bilder-Ordner, wie Sie möchten.

JEDOCH

Hier ist, wo die Dinge kompliziert für einen Moment bekommen gehen.

Auf Heroku können Sie tatsächlich Dateien in das Dateisystem schreiben, aber sie werden nach kurzer Zeit DISAPPEAR.

Herokus Dateisystem ist EPHEMERAL, das bedeutet, dass Sie es behandeln sollten, als ob es nicht existiert.

Der Grund, warum Heroku dies tut, ist, weil sie versuchen, Sie zu zwingen, skalierbare Software zu schreiben.

Wenn Ihre Anwendung Dateien auf Ihre Webserver-Festplatte schreibt, wird sie nicht sehr skaliert.Der Grund dafür ist, dass der Speicherplatz begrenzt ist. Jeder Webserver verfügt über eine eigene Festplatte. Dies kann zu einem verwirrenden/seltsamen Verhalten führen, bei dem jeder Webserver eine Kopie der gleichen Datei (en) usw. hat. Es ist einfach keine gute Übung.

Stattdessen sollten Sie einen Dateispeicherdienst (normalerweise Amazon S3) verwenden, um Ihre Dateien an einem zentralen Speicherort zu speichern.

Mit diesem Dienst können Sie alle Ihre Dateien an einem zentralen Ort speichern. Das bedeutet:

  • Sie können einfach von ALLEN Webservern auf Ihre Dateien zugreifen.
  • Sie können "zuverlässigen" Speicher haben, der von einem Unternehmen verwaltet wird.
  • Sie können Ihre Webanwendungen besser skalieren.
+0

Hallo, tolle Tipps zur Verwendung von s3. Es ist ein Prototyp, also war es für den Moment nicht so schwierig, Speicher zu finden. Ich schreibe es für jetzt, weil ich FFMPEG verwende, um eine Diashow mit den Bildern/Audio zu erstellen Ich habe diesen Code ausprobiert und es gibt mir den gleichen Fehler. Fehler: ENOENT: keine solche Datei oder Verzeichnis, öffnen '/app/public/images/1435595969584256195_4232065786.jpg' Ich bin dumm zu denken, ich musste unter der Wurzel gehen, da heroku die Dateistruktur bereits geändert. Welches Problem habe ich jetzt? Ist der Ordner nicht vorhanden? – Jason

Verwandte Themen