2012-04-28 3 views
9

Ich bin sehr neu zu Knoten und Heroku und ich vermute, das ist eine Art von einfachen Erlaubnis Problem usw., aber ich kann es anscheinend nicht aufspüren.Heroku (Cedar) + Knoten + Express + Jade Client-Seite Javascript-Dateien im Unterverzeichnis arbeiten lokal mit Vorarbeiter + Curl, aber nicht, wenn Heroku geschoben

Ich habe mehrere reine Javascript-Dateien in einem Unterverzeichnis eine Ebene unter meinem Stammverzeichnis, wo meine web.js-Datei sitzt. Ich habe eine Linie in meinem web.js dem Verzeichnis

app.use('/heatcanvas',express.static(__dirname+'/heatcanvas')); 

angeben Datei Wenn ich meine Anwendung lokal mit Heroku Foreman laufen bekomme ich die erwartete js Antwort, wenn ich den folgenden curl Befehl ausführen

curl localhost:5000/heatcanvas/heatcanvas.js 

jedoch, wenn ich zu Heroku schieben und drücken Sie die corresponsing Live-uRL im Browser

www.example.com/heatcanvas/heatcanvas.js 

erhalte ich folgendes:

Wenn ich Firebug und/oder die Heroku-Protokolle überprüfe, sehe ich, dass ich tatsächlich 404 Fehler für diese Dateien bekomme, obwohl der Pfad mit dem übereinstimmt, was lokal gemacht wird. Es ist auch erwähnenswert, dass Javascript von Drittanbietern in Ordnung ist, nur wenn das src-Attribut des Skript-Tags auf meine Website zeigt, dass ein Problem vorliegt. Was muss ich tun, damit meine Skripts verfügbar sind?

+2

Ich habe mich nie mit den Einzelheiten befasst, aber ich weiß, dass Sie in Rails auf Heroku Ihre statischen Assets in root/public stellen/kompilieren. Zum Beispiel kompiliert Rails '/ assets/base.sass' nach'/public/stylesheets/base.css'. Also denke ich, dass Heroku das "öffentliche" Verzeichnis als statisch zugängliches Verzeichnis darstellt. Sie können im Allgemeinen nicht auf beliebige Dateien auf Produktionsservern zugreifen, wie Sie es von herkömmlichen PHP-Apps gewohnt sind. Sie müssten eine GET-Route angeben, die diese heatcanvas.js-Datei tatsächlich bereitstellt - aber das möchten Sie nicht tun. Ich bin wirklich rostig, aber vielleicht versuche ich das "öffentliche" Verzeichnis zu benutzen. – danneu

+1

Auf dem [Cedar-Stack] (https://devcenter.heroku.com/articles/cedar) werden Anforderungen an den Dyno ungestört weitergeleitet. Es liegt also an der App/dem Framework, statische Assets zu liefern. Das einzige besondere an dem 'public'-Verzeichnis ist, dass die Rails-App/das Framework Assets von dort bedient. Node.js Apps werden unterschiedliche Strukturen haben. –

+0

Können Sie während einer dieser Anfragen die Ausgabe von 'heroku logs -t' mit angeben? –

Antwort

6

Ich empfehle Ihnen process.cwd() Wert verwenden bestimmten Verzeichnis

process.env.PWD = process.cwd() 

ganz am Anfang Ihrer web.js

können Sie Dateien einfach zu bekommen zugreifen.

können Sie tun

app.use('/heatcanvas',express.static(process.env.PWD+'/heatcanvas')); 

statt

__dirname 

Warnung mit: Stellen Sie sicher, web.js im Stammverzeichnis von web.js (Heroku web.js ausgeführt werden, auszuführen auf diese Weise)

+1

Danke, das hat mir sehr geholfen!Nicht sicher, ob das OP das gleiche Setup hat, aber ich führe Heroku mit mehreren Dynos aus, und es stellt sich heraus, dass du 'app.use (... __dirname + '/ path');' nicht verwenden kannst, wie ich es lokal getan habe . Sie müssen stattdessen 'process.env.PWD' verwenden. – Gromix

+0

Wie es scheint, funktioniert das nicht für mich! Heroku preapped immer einen Ordner mit dem Namen "app", also denkt er, dass sich meine server.js (im root) in einem Ordner namens "app" befindet. Lokale Tests sind in Ordnung. – Pille

+0

iam im selben Status Pille wie hast du diese App Standardordner Ereignisse in diesem Bereich korrigiert (lokale ist immer in Ordnung für mich auch) – dewelloper