2012-04-28 11 views
9

Jestem bardzo nowy dla węzła i heroku i podejrzewam, że jest to rodzaj prostego pozwolenia problem itp., ale nie mogę tego wyśledzić.Heroku (Cedar) + Node + Express + Jade Pliki javascript po stronie klienta w podkatalogu działają lokalnie z brygadzistą + zwijaniem, ale nie wtedy, gdy są wypychane do Heroku

Mam kilka czystych plików javascript w podkatalogu jeden poziom pod moim katalogiem głównym, w którym znajduje się mój plik web.js. Mam linia w moich web.js plik, aby określić katalog

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

Jeśli uruchomię moją aplikację lokalnie z Heroku Foreman uzyskać oczekiwaną odpowiedź js kiedy uruchomić następujące polecenie Curl

curl localhost:5000/heatcanvas/heatcanvas.js 

jednak kiedy wciskam do Heroku i uderzył corresponsing żywo URL w przeglądarce

www.example.com/heatcanvas/heatcanvas.js 

otrzymuję następujący:

Cannot GET /heatcanvas/heatcanvas.js 

Jeśli sprawdzam dzienniki Firebug i/lub Heroku, widzę, że otrzymuję błędy 404 dla tych plików, mimo że ścieżka powinna pasować do tego, co jest robione lokalnie. Warto również wspomnieć, że javascript trzeciej strony przychodzi dobrze, tylko wtedy, gdy atrybut src znacznika script wskazuje na moją stronę, pojawia się problem. Co muszę zrobić, aby moje skrypty były dostępne?

+2

Nigdy nie sprawdzałem szczegółów, ale wiem, że w Railsach na Heroku umieszczasz/kompilujesz swoje zasoby statyczne w katalogu głównym/publicznym. Na przykład Railsy kompilują '/ assets/base.sass' do'/public/stylesheets/base.css'. Myślę więc, że Heroku ujawnia "publiczny" katalog jako statyczny dostępny reż. Z reguły nie można uzyskać dostępu do dowolnych plików na serwerach produkcyjnych, tak jak w zwykłych aplikacjach PHP. Musisz podać trasę GET, która faktycznie obsługuje plik heatcanvas.js - ale nie chcesz tego robić. Jestem naprawdę zardzewiała, ale może spróbuję wykorzystać "publiczny" reż. – danneu

+1

Na stosie [Cedar] (https://devcenter.heroku.com/articles/cedar) żądania są kierowane do dyno bez zakłóceń. Od aplikacji/frameworku zależy więc na udostępnianiu zasobów statycznych. Jedyną specjalnością katalogu "public" jest to, że aplikacja/struktura Railsowa obsługuje stamtąd zasoby. Aplikacje Node.js będą miały inną strukturę. –

+0

Czy możesz dołączyć wynik "logi heroku-t" podczas jednego z tych żądań? –

Odpowiedz

6

polecam użyć process.cwd() wartość dostać określonego katalogu

process.env.PWD = process.cwd() 

na samym początku swojego web.js

pozwalają łatwo uzyskać dostęp do plików.

Można zrobić

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

zamiast korzystania

__dirname 

Ostrzeżenie: Upewnij się, aby wykonać web.js w katalogu głównym web.js (web.js Heroku są wykonywane w ten sposób)

+1

Dzięki, to mi bardzo pomogło!Nie jestem pewien, czy OP ma tę samą konfigurację, ale uruchamiam Heroku z kilkoma dynami i okazuje się, że nie możesz użyć 'app.use (... __dirname + '/ path');', tak jak zrobiłem to lokalnie . Zamiast tego należy użyć 'process.env.PWD'. – Gromix

+0

Jak się wydaje, to nie działa dla mnie! Heroku zawsze wstępnie dołącza folder o nazwie "app", więc myśli, że mój server.js (w katalogu głównym) znajduje się w folderze o nazwie "app". Testowanie na miejscu jest w porządku. – Pille

+0

iam w tym samym statusie Pille, w jaki sposób poprawiłeś domyślne zdarzenia folderów w tej aplikacji (lokalny jest zawsze dla mnie ok) – dewelloper

Powiązane problemy