2013-08-10 10 views
10

Voglio usare file statico servire senza qualsiasi motore di rendering. Ho cercato di usare:res.sendfile() non serve bene javascripts

res.sendfile('public/index.html'); 

sulla rotta '/' GET, ed esprimere middleware per file statici sul mio percorso:

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

MA sembra che tutti i javascript che il cliente richiede vengono scaricati con le informazioni sul file index.html.

Come posso eseguire correttamente il download dei file statici CSS/JS?

UPDATE:

Ecco il percorso per il "res.sendfile ...":

app.get('/*', index); 

Voglio che tutti le richieste al server su qualsiasi percorso otterrà index.html e tutto il suo JS & CSS assosiato con.

+0

Se si vuole servire solo i file statici, non si usa il middleware del router, è semplice :) In realtà, non c'è nemmeno bisogno di Express per questo scopo. – gustavohenke

+0

quindi come posso farlo se voglio render index.html che contiene js? – ohadinho

+0

https://npmjs.org/package/http-server – gustavohenke

risposta

-1

Ho fatto un presupposto qui che i percorsi sono dichiarati in questo ordine:

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

Se questo è davvero il caso, allora il seguente suggerimento vale:

Il problema qui è l'applicazione .get ('/ *', ...) intercetterà tutte le richieste che corrispondono, che è fondamentalmente tutto. Il middleware statico non avrà la possibilità di servire i file.

Se si rimuove tale percorso, le cose dovrebbero funzionare come index.html è già nella directory public e può essere servito dal middleware statico.

Per una buona spiegazione di come funziona, vedere la risposta a questa domanda: node.js/express.js - How does app.router work?

Aggiornamento in base aggiunte alla domanda di cui sopra:

Hai dichiarato questo come il comportamento attuale di il tuo server:

sembra che tutti i javascript che il client richiede vengano scaricati con le informazioni sul file index.html.

Hai fatto la domanda:

Come posso fare un download di successo dei file statici/JS CSS?

con questo requisito

Voglio tutte le richieste al server su una rotta otterrà index.html e tutti i suoi JS CSS & assosiciated con.

La tua domanda e il requisito sono opposti l'uno all'altro. Il server invierà al client esattamente ciò che viene detto/configurato. Restituirà sempre index.html che è esattamente ciò che afferma il tuo requisito, o servirà con successo sia lo index.html sia qualsiasi riferimento CSS/Javascript che è ciò che era la tua affermazione originale.

In uno dei vostri commenti qui sotto che hai dichiarato:

il motivo che voglio farlo, è perché sto utilizzando i modelli, e index.html avvolge ogni modello. Sto usando angular sul client, e sto iniziando a capire che dovrò usare un motore di rendering per raggiungere questo obiettivo. Ancora una volta, il mio cliente angolare definisce l'URL parziale, e quando invia la richiesta a: '/ parziale/campione' ho bisogno del index.html per avvolgere la 'sample.html' per esempio

mie ipotesi basate su questa dichiarazione (si prega di correggere se sbagliato)

  • si utilizza lato client modelli
  • I file si recupera dal server sono statici (per esempio, hanno bisogno di essere servito come è dalla server)
  • I percorsi sono attualmente dichiarati in questo ordine
    1. app.use (app.router);
    2. app.use (express.static (path.join (__ dirname, 'public')));
  • non sta facendo alcun template lato server (cioè tutto si trova sotto public da qualche parte)

Se queste ipotesi sono corrette, la correzione è di fare quello che originariamente proposto e rimuovere questo percorso:

app.get('/*', index); 

Se si esegue questa operazione (assumendo le risorse si fa riferimento correttamente):

  • il tuo index.html verrà recuperato dal server tramite il middleware statico.
  • Ogni css/js file che hai fatto riferimento in index.html verrà restituito dal server tramite il middleware statica
  • Eventuali richieste per caricare file di modello (come sample.html) verranno soddisfatti dal vostro middeware statica ed è tornato a il cliente senza modifiche
+0

Bene, questo dipende da dove si blocca 'app.use (app.router);' nel proprio script. – deitch

+0

Anche se sono d'accordo; Non sono sicuro del motivo per cui si vorrebbe fare 'res.sendfile ('public/index.html')' poiché è * già * nel percorso pubblico. – deitch

+0

@deitch buon punto. Avevo fatto un'ipotesi che potrebbe non essere valido qui. Un altro codice pubblicato aiuterebbe sicuramente a diagnosticare il problema. – dc5

17

Credo che questo potrebbe aiutare ...

in app.js file di ...

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

app.use("/styles", express.static(__dirname + '/public/stylesheets')); 
app.use("/scripts", express.static(__dirname + '/public/javascripts')); 
app.use("/images", express.static(__dirname + '/public/images')); 


// development only 
if ('development' == app.get('env')) { 
    app.use(express.errorHandler()); 
} 

app.get('/', function (req, res) { 
     res.sendfile(__dirname + '/public/home.html'); 
}); 

salvare home.html all'interno della cartella /public e file JavaScript in /public/javascripts, immagini in /public/images, file css nella cartella /public/stylesheets.

Nel riferimento file HTML dovrebbero essere le parole si definiscono (es:/scripts /home.js) ... come questo

<link rel="stylesheet" type="text/css" href="/styles/home.css" > 
    <script src="/scripts/home.js" type="text/javascript"></script> 
+0

Grazie. Per me funziona. – MageXellos

0

Perché non qualcosa di simile?

if(req.url == '/') { // Root lookups appear to be mapped to index.html 
    next(); 
} else { 
    fname = [disk location of your website] + req.url; 
    fs.open(fname, 'r', function(err, fd) { 
     if(err) { 
      next(); 
     } else { 
      fs.close(fd); 
      res.sendfile(fname); 
     } 
    }); 
} 
1
var express=require("express"); 

var app=express(); 

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


app.set("views",__dirname+'/website/views'); 


app.get("/",function(req,res){ 
    res.sendfile('index.html'); 

}); 

codici di cui sopra è mine.i desiderio di aiutarvi.

+0

Si prega di fornire la spiegazione del proprio codice. Le risposte al solo codice non sono apprezzate. –

0

Bene, la soluzione più semplice è quello di spostare app.use(express.static(path.join(__dirname, 'public')))

up prima di chiamare app.use(app.router);

In questo modo, il middleware statica viene servita prima della app.get('/*', index);