9

我在站点中有一个多层次的 .html、.js、.png、.css 等文件集合。看看我的网站层次结构如下所示:

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 控制台窗口中,我从未看到“正在返回 [js|css|png 文件名]”。就像我的 node.js Web 服务器返回 index.html 一样。

我究竟做错了什么?

4

2 回答 2

16

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

于 2013-11-18T23:48:33.553 回答
5

您提供的任何文件是否包含相对路径(例如../abc.js)?您必须使用path.resolve()才能获得fs.readFile().

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

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

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

尝试

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

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

于 2013-10-11T17:01:51.710 回答