node js localhost shal打开一个文件

时间:2013-03-16 01:26:55

标签: node.js

教程:我想通过localhost打开一个文件,但我不知道在浏览器中输入哪条路径。是localhost,我的server.js所在的位置? (对不起,我是编程和节点的新手)

教程码

var path = require('path'),
    fs = require('fs');

require('http').createServer(function(req, res) {
  var file = path.normalize(req.url);

  console.log(file);

  path.exists(file, function(exists) {
    if (exists) {
      fs.stat(file, function(err, stat) {
        var rs;

        if (err) { throw err; }
        if (stat.isDirectory()) {
          res.writeHead(403);
          res.end('Forbidden');
        } else {
          rs = fs.createReadStream(file);
          res.writeHead(200);
          rs.pipe(res);
        }
      });
    } else {
      res.writeHead(404);
      res.end('Not found');
    }
  })
}).listen(4000);

1 个答案:

答案 0 :(得分:2)

request.url通常为/something/like/an/absolute/path,除非您收到来自HTTP代理客户端的请求(将http://...前缀添加到request.url)或发出一些自定义HTTP请求。

无论如何path.normalize只关注...。 您的代码将允许任何人访问您计算机上的任何文件(可由运行node进程的帐户访问)。

更好/更安全的做法是将__dirname与解码的request.url连接,并检查解析路径是否以要从中提供静态内容的目录的绝对路径(带尾随路径分隔符)开始:

var scriptDir = path.resolve(__dirname + path.sep + "static" + path.sep),
    requestPath = decodeURIComponent(request.url);
requestPath = path.resolve(path.join(__dirname, "static", requestPath));
if (requestPath.indexOf(scriptDir) === 0) {
    // serve the file
} else {
    response.writeHead(403);
    response.end(http.STATUS_CODES[403]);
}

现在,如果您请求发言,http://localhost:4000/index.html它应该提供/path/to/your/node/app/dir/static/index.html

中的文件