Express-js non può OTTENERE i miei file statici, perché?


308

Ho ridotto il mio codice alla semplice app express-js che potevo realizzare:

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

La mia directory è simile a questa:

static_file.js
/styles
  default.css

Tuttavia quando accedo http://localhost:3001/styles/default.cssottengo il seguente errore:

Cannot GET / styles /
default.css

Sto usando express 2.3.3e node 0.4.7. Che cosa sto facendo di sbagliato?


Risposte:


492

Prova http://localhost:3001/default.css.

Per avere /stylesnell'URL della richiesta, utilizzare:

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

Guarda gli esempi in questa pagina :

//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
Grazie. Come nuovo per Node ed Express, la documentazione di Express sembra imprecisa fino a quando non scopri che Connect è dove si trovano i documenti del middleware.
Nate,

4
Sì. Era il taglio mancante nel mio caso.
borisdiakur,

Nel mio caso non mi ero reso conto che il percorso di montaggio fosse incluso nel percorso, come spiegato nel secondo esempio. Grazie!
Mike Cheel,

In caso di nuova installazione, è necessario verificare che il modulo express sia installato correttamente ( expressjs.com/en/starter/installing.html ), quindi controllare il percorso e il nome della directory come ha detto Giacomo;)
Spl2nky

utilizzare sempre path.joinper superare i problemi di separatore di directory multipiattaforma. path.join (__ dirname, '/')
Doug Chamberlain,

35

Ho lo stesso problema. Ho risolto il problema con il seguente codice:

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

Esempio di richiesta statica:

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

Ho bisogno di una soluzione più semplice. Esiste?


Grazie per aver condiviso la tua soluzione indipendentemente dal fatto che sia ottimale o meno. Se desideri riaprire il problema per l'ottimizzazione, considera di pubblicare una nuova domanda che descriva in dettaglio le nuove circostanze. Se l'ottimizzazione è l'unico scopo, la domanda potrebbe essere più adatta alla revisione del codice SO .

15

default.css dovrebbe essere disponibile all'indirizzo http://localhost:3001/default.css

In stylesin app.use(express.static(__dirname + '/styles'));dice a express di cercare nella stylesdirectory un file statico da servire. Non confonde, quindi, fa parte del percorso su cui è disponibile.


3
Totalmente! Che è per convenzione in express.js lo si fa su /publicche ha css, js, imgle cartelle in modo da poter http://localhost:3001/css/default.css:)
Kit Sunde

15

Questo lavoro per me:

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

9

Nel tuo server.js:

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

Hai dichiarato express e app separatamente, hai creato una cartella denominata "pubblica" o come preferisci, eppure puoi accedere a queste cartelle. Nel tuo template src, hai aggiunto il percorso relativo da / public (o il nome del destino della tua cartella ai file statici). Fai attenzione alle barre sui percorsi.


6

Ciò che ha funzionato per me è:

Invece di scrivere app.use(express.static(__dirname + 'public/images'));nel tuo app.js

Basta scrivere app.use(express.static('public/images'));

vale a dire rimuovere il nome della directory principale nel percorso. E quindi puoi utilizzare efficacemente il percorso statico in altri file js, ad esempio:

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

Spero che questo ti aiuti :)


Questo ha risolto il mio problema. Nel mio codice, path to CSS funzionava bene anche con la concatenazione __dirname (usando path.join), mentre il recupero di js non riusciva.
Chim

Sono contento che mi abbia aiutato :)
Amir Aslam il

5

Sto usando Bootstrap CSS, JS e Fonts nella mia applicazione. Ho creato una cartella chiamata assetnella directory principale dell'app e ho inserito tutte queste cartelle al suo interno. Quindi nel file del server è stata aggiunta la seguente riga:

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

Questa linea mi permette di caricare i file che si trovano nella assetdirectory dal /assetprefisso del percorso come: http://localhost:3000/asset/css/bootstrap.min.css.

Ora nelle viste posso semplicemente includere CSS e JS come di seguito:

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

5

per servire file statici (css, immagini, file js) solo due passaggi:

  1. passa la directory dei file css al middleware express.static integrato

    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. per accedere ai file CSS o alle immagini basta digitare l'URL http: // localhost: port / filename.css ex: http: // localhost: 8081 / bootstrap.css

nota: per collegare i file CSS a HTML basta digitare<link href="file_name.css" rel="stylesheet">

se scrivo questo codice

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

per accedere ai file statici basta digitare url: localhost: port / css / nomefile ex: http: // localhost: 8081 / css / bootstrap.css

nota per collegare i file CSS con HTML basta aggiungere la seguente riga

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

3

questo ha funzionato per me

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

Trovo il mio file CSS e aggiungo un percorso ad esso:

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

Quindi sembra funzionare.


Non consiglierei questo approccio poiché dovresti usare ExpressJS .use()e express.static()metodi per inviare dove stai servendo i tuoi file. Altrimenti avrai uno di questi router per file nella tua directory pubblica e questo è un sacco di overhead da mantenere.
Sgnl

Questo è un problema ma non credo sia appropriato. Se hai molti file CSS e JS, come puoi mantenerlo?
arsho,

0

Oltre a quanto sopra, assicurati che il percorso del file statico inizi con / (ex ... / assets / css) ... per servire i file statici in qualsiasi directory sopra la directory principale (/ main)


2
Aggiunta a quanto sopra? Dichiaralo nella tua risposta (dai credito alla persona che l'ha pubblicato, se necessario). Quindi spesso cambia l'ordine delle risposte in modo che tutte le risposte vengano visualizzate e non le prime. Non sappiamo di cosa stai parlando.
Zachary Kniebel,

0

se la tua configurazione

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

quindi,
inserisci app.js

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

e fai riferimento a style.css: (in alcuni file .pug):

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

Perché dovresti introdurre un passaggio di ridenominazione pubblico -> statico? Direi che è solo un'informazione extra più confusa. Ma di nuovo l'indirizzamento di solito è una buona cosa ...
Masterxilo,

0
  1. Creare una cartella con nome "pubblico" nella
    cartella del progetto Nodejs .
  2. Inserisci il file index.html nella cartella del progetto Nodejs.
  3. Metti tutti i file script e css nella cartella pubblica.
  4. Uso app.use( express.static('public'));

  5. e nel index.html percorso corretto degli script a<script type="text/javascript" src="/javasrc/example.js"></script>

E ora tutto funziona bene.


0

directory statica

controlla l'immagine sopra (directory statica) per la struttura dir

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'))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.