2013-10-11 174 views
8

我在一個站點中有多級集合的.html,.js,.png,.css等文件。在我的網站hiearchy偷看看起來如下所示:Node.js +用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 
    ... 
... 

我正在遷移它以在Node.js下運行。我被告知我必須使用RESTIFY。目前,我已經爲我的服務器編寫了以下代碼:

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

通過此代碼,我可以成功加載index.html。但是,我的index.html文件引用了一些JavaScript,圖像文件和樣式表。我可以通過Fiddler看到這些文件正在被請求。但是,在我的node.js控制檯窗口中,我從來沒有看到「Returing [js | css | png filename]」。它就像我的node.js web服務器返回index.html,就是這樣。

我在做什麼錯?

+1

我看不到的點,如果要添加非休息的功能,如靜態文件服務使用'restify'。 'express'提供您需要的所有內容和更多內容,增加更好的文檔,經過驗證的生產穩定性和社區支持。 – srquinn

回答

5

您的任何服務文件是否包含相對路徑(如../abc.js)? 您必須使用path.resolve()才能獲得fs.readFile()的真實路徑。

反正還有在服務的文件很多陷阱:

  • 無效找不到網址(400)
  • 文件(404)
  • 轉義序列(URL編碼)
  • fs.read()讀取文件(由@robertklep提供)
  • etc

您可以使用現有的靜態文件服務中間件。
我一直在使用Ecstatic,AFAIK它正確處理這些問題。

嘗試

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

如果失敗,你可以參考this堆棧的RESTify上連接/快遞的頂部。

+0

+1用於暗示使用靜態中間件(fs.readFile的另一個問題是它首先將文件讀入內存) – robertklep