2013-10-11 24 views
8

Mam wielopoziomową kolekcję plików .html, .js, .png, .css, itp. W witrynie. Rzut oka na mojej stronie hierarchi wygląda tak:Node.js + Pliki statyczne z 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 
    ... 
... 

Jestem migracji to uruchomić pod Node.js. Powiedziano mi, że MUSZĘ używać RESTYFIKACJI. Obecnie napisałem na mój serwer:

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; 
} 

Za pomocą tego kodu mogę pomyślnie załadować plik index.html. Jednak mój plik index.html odwołuje się do niektórych skryptów JavaScript, plików obrazów i stylów. Widzę za pośrednictwem Fiddlera, że ​​żądane są te pliki. Jednak w oknie konsoli node.js nigdy nie widzę "Returing [js | css | png filename]". To jak mój serwer WWW node.js zwraca index.html i to wszystko.

Co robię źle?

+1

nie widzę sensu w użyciu 'restify' jeśli dodajesz niż możliwości reszta jak plik statyczny podaniem. 'express' oferuje wszystko, czego potrzebujesz i więcej, z dodatkiem lepszych dokumentów, sprawdzonej stabilności w produkcji i wsparcia społeczności. – srquinn

Odpowiedz

5

Czy któryś z obsługiwanych plików zawiera względne ścieżki (na przykład ../abc.js)? Musisz użyć path.resolve(), aby uzyskać prawdziwą ścieżkę dla fs.readFile().

Zresztą istnieje wiele pułapek w plikach obsługujących:

  • Nieprawidłowy URL nie znaleziono (400)
  • pliku (404)
  • sekwencja ucieczki (kodowanie URL)
  • fs.read() odczytać pliki do pamięci (przez @robertklep)
  • itd.

Możesz użyć istniejącego oprogramowania do obsługi plików statycznych.
Używam Ecstatic, AFAIK poprawnie obsługuje te problemy.

Spróbuj

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

Jeśli to nie można odwołać się do this stos Restify na szczycie Połącz/Express.

+0

+1 za sugerowanie używania statycznego oprogramowania pośredniego (innym problemem z 'fs.readFile' jest to, że najpierw wczytuje pliki do pamięci) – robertklep

Powiązane problemy