Express-js nie może uzyskać moich plików statycznych, dlaczego?


308

Zredukowałem swój kod do najprostszej aplikacji express-js, jaką mogłem zrobić:

var express = require("express"),
    app = express.createServer();
app.use(express.static(__dirname + '/styles'));
app.listen(3001);

Mój katalog wygląda następująco:

static_file.js
/styles
  default.css

Jednak po uzyskaniu dostępu pojawia http://localhost:3001/styles/default.csssię następujący błąd:

Cannot GET / styles /
default.css

Używam express 2.3.3i node 0.4.7. Co ja robię źle?


Odpowiedzi:


491

Spróbować http://localhost:3001/default.css.

Aby mieć /stylesadres URL żądania, użyj:

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

Spójrz na przykłady na tej stronie :

//Serve static content for the app from the "public" directory in the application directory.

    // GET /style.css etc
    app.use(express.static(__dirname + '/public'));

// Mount the middleware at "/static" to serve static content only when their request path is prefixed with "/static".

    // GET /static/style.css etc.
    app.use('/static', express.static(__dirname + '/public'));

42
Dziękuję Ci. Jako osoba, która jest nowa w Node and Express, dokumentacja Express wydaje się szkicowa, dopóki nie odkryjesz, że Connect jest tam, gdzie są dokumenty oprogramowania pośredniego.
Nate

4
Tak. W moim przypadku był to brakujący ukośnik .
borisdiakur

W moim przypadku nie zdawałem sobie sprawy, że ścieżka montowania została uwzględniona na ścieżce, jak wyjaśniono w drugim przykładzie. Dzięki!
Mike Cheel

W przypadku nowej instalacji powinieneś sprawdzić, czy moduł ekspresowy jest poprawnie zainstalowany ( expressjs.com/en/starter/installing.html ), a następnie sprawdź ścieżkę i nazwę katalogu, jak powiedział Giacomo;)
Spl2nky

zawsze używaj path.joindo przezwyciężenia problemów związanych z separatorem katalogów między platformami. path.join (__ dirname, '/')
Doug Chamberlain

35

Mam ten sam problem. Rozwiązałem problem z następującym kodem:

app.use('/img',express.static(path.join(__dirname, 'public/images')));
app.use('/js',express.static(path.join(__dirname, 'public/javascripts')));
app.use('/css',express.static(path.join(__dirname, 'public/stylesheets')));

Przykład żądania statycznego:

http://pruebaexpress.lite.c9.io/js/socket.io.js

Potrzebuję prostszego rozwiązania. Czy to istnieje?


Dziękujemy za udostępnienie rozwiązania niezależnie od tego, czy jest ono optymalne, czy nie. Jeśli chcesz ponownie otworzyć problem w celu optymalizacji, rozważ opublikowanie nowego pytania opisującego nowe okoliczności. Jeśli jedynym celem jest optymalizacja, pytanie to może lepiej pasować do przeglądu kodu SO .

15

default.css powinien być dostępny pod adresem http://localhost:3001/default.css

In stylespo app.use(express.static(__dirname + '/styles'));prostu mówi ekspresowi, aby szukał w styleskatalogu statycznego pliku do obsłużenia. Nie tworzy (myląco) części ścieżki, na której jest dostępny.


3
Całkowicie! Który jest umownie w express.js to zrobić na /publicktóry ma css, js, imgfoldery, dzięki czemu można http://localhost:3001/css/default.css:)
Kit Sunde

15

Ta praca dla mnie:

app.use('*/css',express.static('public/css'));
app.use('*/js',express.static('public/js'));
app.use('*/images',express.static('public/images'));

9

W twojej server.js:

var express   =     require("express");
var app       =     express();
app.use(express.static(__dirname + '/public'));

Zadeklarowałeś osobno ekspres i aplikację osobno, utwórz folder o nazwie „publiczny” lub jak chcesz, a mimo to możesz uzyskać do niego dostęp. W szablonie src dodano ścieżkę względną z / public (lub nazwę przeznaczenia folderu do plików statycznych). Uważaj na paski na trasach.


6

Dla mnie zadziałało:

Zamiast pisać app.use(express.static(__dirname + 'public/images'));w pliku app.js

Po prostu napisz app.use(express.static('public/images'));

tzn. usuń nazwę katalogu głównego ze ścieżki. Następnie możesz efektywnie wykorzystać ścieżkę statyczną w innych plikach js, na przykład:

<img src="/images/misc/background.jpg">

Mam nadzieję że to pomoże :)


To rozwiązało mój problem. W moim kodzie ścieżka do CSS działała dobrze, nawet z konkatenacją __dirname (przy użyciu path.join), podczas gdy pobieranie js nie powiodło się.
Chim

Cieszę się, że pomogłem :)
Amir Aslam

5

Używam Bootstrap CSS, JS i czcionek w mojej aplikacji. Utworzyłem folder o nazwie assetw katalogu głównym aplikacji i umieściłem w nim wszystkie te foldery. Następnie w pliku serwera dodano następujący wiersz:

app.use("/asset",express.static("asset"));

Linia ta pozwala mi załadować pliki znajdujące się w assetkatalogu z /assetprzedrostkiem ścieżki jak: http://localhost:3000/asset/css/bootstrap.min.css.

Teraz w widokach mogę po prostu dołączyć CSS i JS jak poniżej:

<link href="/asset/css/bootstrap.min.css" rel="stylesheet">

5

do obsługi plików statycznych (css, obrazy, pliki js) wystarczy dwa kroki:

  1. przekazać katalog plików css do wbudowanego oprogramowania pośredniego express.static

    var express = require('express');
    var app = express();
    /*public is folder in my project directory contains three folders
    css,image,js
    */
    //css  =>folder contains css file
    //image=>folder contains images
    //js   =>folder contains javascript files
    app.use(express.static( 'public/css'));
  2. aby uzyskać dostęp do plików lub obrazów css, po prostu wpisz adres URL http: // localhost: port / filename.css np: http: // localhost: 8081 / bootstrap.css

Uwaga: aby połączyć pliki CSS z HTML, po prostu wpisz<link href="file_name.css" rel="stylesheet">

jeśli napiszę ten kod

var express = require('express');
var app = express();
app.use('/css',express.static( 'public/css'));

aby uzyskać dostęp do plików statycznych, wpisz adres URL: localhost: port / css / filename.css np: http: // localhost: 8081 / css / bootstrap.css

Uwaga, aby połączyć pliki css z HTML, wystarczy dodać następujący wiersz

<link href="css/file_name.css" rel="stylesheet">    

3

ten działał dla mnie

app.use(express.static(path.join(__dirname, 'public')));

app.use('/img',express.static(path.join(__dirname, 'public/images')));

app.use('/shopping-cart/javascripts',express.static(path.join(__dirname, 'public/javascripts')));

app.use('/shopping-cart/stylesheets',express.static(path.join(__dirname, 'public/stylesheets')));

app.use('/user/stylesheets',express.static(path.join(__dirname, 'public/stylesheets')));

app.use('/user/javascripts',express.static(path.join(__dirname, 'public/javascripts')));


1

Znajduję mój plik css i dodam do niego trasę:

app.get('/css/MyCSS.css', function(req, res){
  res.sendFile(__dirname + '/public/css/MyCSS.css');
});

To wydaje się działać.


Nie poleciłbym tego podejścia, ponieważ powinieneś używać ExpressJS .use()iexpress.static() metod do wysyłania tam, gdzie podajesz swoje pliki. W przeciwnym razie będziesz mieć jeden z tych routerów na plik w swoim katalogu publicznym i to będzie dużo narzutów do utrzymania.
Sgnl

To jest obejście, ale nie sądzę, aby było właściwe. Jeśli masz wiele plików CSS i JS, jak możesz je utrzymać?
arsho

0

Oprócz powyższego upewnij się, że ścieżka do pliku statycznego zaczyna się od / (ex ... / resources / css) ... aby obsługiwać pliki statyczne w dowolnym katalogu powyżej katalogu głównego (/ main)


2
Dodatek do powyższego? Podaj go w swojej odpowiedzi (jeśli to konieczne, uznaj osobę, która go opublikowała). TAK często zmienia kolejność odpowiedzi, aby wszystkie odpowiedzi były widoczne, a nie pierwszych. Nie wiemy o czym mówisz.
Zachary Kniebel 11.04.13

0

jeśli twoja konfiguracja

myApp
  |
  |__ public
  |     |
  |     |__  stylesheets
  |     |     |
  |     |     |__ style.css
  |     |
  |     |___ img
  |           |
  |           |__ logo.png
  |
  |__ app.js

następnie
wstaw app.js

app.use('/static', express.static('public'));

i odwołaj się do swojego style.css: (w pliku .pug):

link(rel='stylesheet', href='/static/stylesheets/style.css')

Dlaczego miałbyś wprowadzić krok zmiany nazwy public -> static? Powiedziałbym, że jest to bardziej mylące dodatkowe informacje. Ale znowu pośrednictwo jest zwykle dobrą rzeczą
masterxilo

0
  1. Utwórz folder o nazwie „publicznej” w projekcie Nodejs
    folderze .
  2. Umieść plik index.html w folderze projektu Nodejs.
  3. Umieść cały skrypt i plik css w folderze publicznym.
  4. Posługiwać się app.use( express.static('public'));

  5. i we index.html właściwej ścieżce skryptów do<script type="text/javascript" src="/javasrc/example.js"></script>

A teraz wszystko działa dobrze.


0

katalog statyczny

sprawdź powyższy obraz (katalog statyczny) pod kątem struktury katalogu

const publicDirectoryPath = path.join(__dirname,'../public')
app.use(express.static(publicDirectoryPath))


//  or

app.use("/", express.static(publicDirectoryPath))
app.use((req, res, next) => {
res.sendFile(path.join(publicDirectoryPath,'index.html'))
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.