Node.js +使用RESTIFY服务静态文件

时间:2013-10-11 14:46:56

标签: 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而那就是它。

我做错了什么?

2 个答案:

答案 0 :(得分:15)

最新版本的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/

答案 1 :(得分:5)

您提供的任何文件都包含相对路径(例如../abc.js)吗? 您必须使用path.resolve()来获取fs.readFile()的真实路径。

无论如何,提供文件存在很多陷阱:

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

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

尝试

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

如果失败,您可以参考this将Restify叠加在Connect / Express之上。