首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用RESTIFY的Node.js +服务静态文件

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

Stack Overflow用户
提问于 2013-10-11 22:46:56
回答 2查看 11.1K关注 0票数 9

我在一个站点中有一个多层次的.html,.js,.png,.css等文件集合。浏览一下我的网站hiearchy如下所示:

代码语言:javascript
复制
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。目前,我已经为我的服务器编写了以下代码:

代码语言:javascript
复制
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一样,仅此而已。

我做错了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-12 01:01:52

你提供的文件中有没有包含相对路径(比如../abc.js)的?您必须使用path.resolve()来获取fs.readFile()的实际路径。

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

  • 无效的url (400)找不到
  • 文件(404)
  • 转义序列(url url将文件读取到内存中(通过@robertklep)
  • etc

您可以使用现有的静态文件服务中间件。

我一直在使用Ecstatic,它能很好地处理这些问题。

试一试

代码语言:javascript
复制
server.use(ecstatic({ root: __dirname + '/' }));

如果这失败了,你可以参考this在连接/快速之上堆栈Restify。

票数 5
EN

Stack Overflow用户

发布于 2013-11-19 07:48:34

最新版本的restify具有内置的中间件serveStatic()中间件,它们将为您完成此操作。

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

代码语言:javascript
复制
server.get(/\/docs\/public\/?.*/, restify.serveStatic({
  directory: './public'
}));

更详细的示例如下:

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

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19321056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档