Node.js +用RESTIFY提供静态文件

我有一个网站中的.html,.js,.png,.css等文件的多级集合。 在我的网站hiearchy偷看看起来像这样:

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就是这样。

我究竟做错了什么?

做任何你服务的文件包含相对path(比如说../abc.js )? 您必须使用path.resolve()来获取path.resolve()的真实path。

无论如何,在提供文件方面有很多缺陷:

  • 无效的url(400)
  • 找不到文件(404)
  • 转义序列(url编码)
  • fs.read()将文件读入内存(由@robertklep)
  • 等等

您可以使用现有的静态文件服务中间件。
我一直在使用欣喜若狂 ,AFAIK正确处理这些问题。

尝试

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

如果失败,你可以参考这个来将Restify堆叠在Connect / Express之上。

最新版本的restify已经内置了中间件serveStatic()中间件,可以为你做到这一点。

http://mcavage.me/node-restify/#Server-API

 server.get(/\/docs\/public\/?.*/, restify.serveStatic({ directory: './public' })); 

更详细的例子:

http://mushfiq.me/2013/11/02/serving-static-files-using-restify/