2013-10-11 12 views
8

Ho una raccolta multi-livello di file .html, .js, .png, .css, etc in un sito. Una sbirciatina al mio sito hiearchy sia simile alla seguente:Node.js + Serve file statici con RESTIFY

index.html 
child1 
    index.html 
    page1.html 
    page2.html 
    ... 
child2 
    grandchild1 
    index.html 
    grandchild2 
    index.html 
    index.html 
    page1.html 
    page2.html 
resources 
    css 
    myTheme.css 
    img 
    logo.png 
    profile.png 
    js 
    jquery.js 
    ... 
... 

sto migrando questo per l'esecuzione con Node.js. Mi è stato detto che DEVO usare RESTIFICA. Attualmente, ho scritto quanto segue per il mio server:

var restify = require('restify'); 
var fs = require('fs'); 
var mime = require('mime'); 

var server = restify.createServer({ 
    name: 'Demo', 
    version: '1.0.0' 
}); 

server.use(restify.acceptParser(server.acceptable)); 
server.use(restify.queryParser()); 
server.use(restify.bodyParser()); 

server.get('/', loadStaticFile); 

server.get('/echo/:name', function (req, res, next) { 
    res.send(req.params); 
    return next(); 
}); 

server.listen(2000, function() { 
    console.log('Server Started'); 
}); 

function loadStaticFile(req, res, next) { 
    var filePath = __dirname + getFileName(req); 
    console.log("Returning " + filePath); 

    fs.readFile(filePath, function(err, data) { 
     if (err) { 
     res.writeHead(500); 
     res.end(""); 
     next(err); 
     return; 
     } 

     res.contentType = mime.lookup(filename); 
     res.writeHead(200); 
     res.end(data); 

     return next(); 
    }); 
} 

function getFileName(req) { 
    var filename = ""; 
    if (req.url.indexOf("/") == (req.url.length-1)) { 
     filename = req.url + "index.html"; 
    } else { 
     console.log("What Now?"); 
    } 
    return filename; 
} 

Con questo codice, posso caricare con successo index.html. Tuttavia, il mio file index.html fa riferimento a JavaScript, file di immagini e fogli di stile. Vedo tramite Fiddler che questi file vengono richiesti. Tuttavia, nella mia finestra della console node.js, non vedo mai "Returing [js | css | nomefile png]". È come il mio server web node.js restituisce index.html e basta.

Cosa sto sbagliando?

+1

Non riesco a vedere il punto nel usando 'restify' se si sta aggiungendo funzionalità non resto come file statici di servire. 'express' offre tutto ciò di cui hai bisogno e di più, con l'aggiunta di documenti migliori, comprovata stabilità nella produzione e supporto della community. – srquinn

risposta

5

Uno dei file forniti contiene percorsi relativi (ad esempio ../abc.js)? È necessario utilizzare path.resolve() per ottenere il percorso reale per fs.readFile().

In ogni caso ci sono un sacco di insidie ​​nel file che servono:

  • URL non valido (400)
  • file non trovato (404)
  • sequenza di escape (codifica URL)
  • fs.read() leggere i file nella memoria (da @robertklep)
  • ecc

È possibile utilizzare il file statico esistente che serve il middleware.
Sto usando Ecstatic, AFAIK gestisce correttamente tali problemi.

Prova

server.use(ecstatic({ root: __dirname + '/' })); 

Se non funziona è possibile fare riferimento a this per impilare Restify in cima Connetti/Express.

+0

+1 per suggerire di utilizzare il middleware statico (un altro problema con 'fs.readFile' è che legge prima i file in memoria) – robertklep