2013-03-20 54 views
3

我的印象是,当您运行nodejs webserver时,web的根目录是包含实现web服务器的js文件的文件夹。所以如果你有C:\ foo \ server.js然后运行它,那么“/”指的是C:\ foo和“/index.htm”映射到C:\ foo \ index.htmnodejs web root

我有一个文件server.js与同级文件default.htm,但是当我尝试加载/default.htm的内容时,找不到该文件。绝对文件路径起作用。

“/”在哪里,它控制着什么?


工作了摄制我把它简化成这样:

var fs = require('fs'); 
var body = fs.readFileSync('/default.htm'); 

,发现它在寻找这

Error: ENOENT, no such file or directory 'C:\default.htm' 

所以 “/” 映射到C:\

有没有办法控制web根目录的映射?


我注意到,相对路径做的工作。所以

var fs = require('fs'); 
var body = fs.readFileSync('default.htm'); 

成功。

我相信我的困惑源自我的原始实验项目文件在驱动器根目录的巧合放置。这允许引用/default.htm来正确解析;只有当我把东西放到一个文件夹中,将它们置于源代码控制之下时,才会显示此问题。

我一定会看看express,但是你还没有回答我的问题:是否有可能重新映射web根目录,如果可以的话如何?

为感兴趣的事,这是server.js,因为它目前为

var http = require('http'); 
var fs = require('fs'); 
var sys = require('sys'); 
var formidable = require('formidable'); 
var util = require('util'); 
var URL = require('url'); 
var QueryString = require('querystring'); 
var mimeMap = { htm : "text/html", css : "text/css", json : "application/json" }; 
http.createServer(function (request, response) { 
    var body, token, value, mimeType; 
    var url = URL.parse(request.url); 
    var path = url.pathname; 
    var params = QueryString.parse(url.query); 
    console.log(request.method + " " + path); 
    switch (path) { 
    case "/getsettings": 
     try { 
     mimeType = "application/json"; 
     body = fs.readFileSync("dummy.json"); //mock db 
     } catch(exception) { 
     console.log(exception.text); 
     body = exception; 
     } 
     break; 
    case "/setsettings": 
     mimeType = "application/json"; 
     body="{}"; 
     console.log(params); 
     break; 
    case "/": 
     path = "default.htm"; 
    default: 
     try { 
     mimeType = mimeMap[path.substring(path.lastIndexOf('.') + 1)]; 
     if (mimeType) { 
     body = fs.readFileSync(path); 
     } else { 
      mimeType = "text/html"; 
      body = "<h1>Error</h1><body>Could not resolve mime type from file extension</body>"; 
     } 
     } catch (exception) { 
     mimeType = "text/html"; 
     body = "<h1>404 - not found</h1>" + exception.toString(); 
     } 
     break; 
    } 
    response.writeHead(200, {'Content-Type': mimeType}); 
    response.writeHead(200, {'Cache-Control': 'no-cache'}); 
    response.writeHead(200, {'Pragma': 'no-cache'}); 
    response.end(body); 
}).listen(8124); 
console.log('Server running at http://127.0.0.1:8124/'); 

我不能完全肯定你的“路线”的意思,但我怀疑setsettings和的getSettings是诸如此类的事情你的意思是,如果我错了,请纠正我。


Nodejs似乎不支持任意映射web根目录。

所有这一切需要的是在文件系统中使用它们之前在前面加上了一段绝对卷材路径:

var URL = require('url'); 
var url = URL.parse(request.url); 
var path = url.pathname; 
if (path[0] == '/') 
    path = '.' + path; 
+0

你能后的server.js文件内容是什么? – 2013-03-20 00:49:06

回答

4

虽然你是正确的,该服务器的根目录是当前工作目录节点.js不会直接传递文件系统上的文件,毕竟这可能会带来一点安全风险。

相反,您需要为其提供路由,然后依次为请求提供内容。

var http = require('http'); 
http.createServer(function (req, res) { 
    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    res.end('Hello World\n'); 
}).listen(1337, '127.0.0.1'); 

一个简单的服务器将刚捕获任何请求,并以同样的方式回应(但不读取文件系统)。

现在,如果你想成为出文件内容,你需要指定一些方法来读取文件到响应流,这是可以做到的几种方法:

  1. 您可以使用fs API找到磁盘上的文件,将其内容读入内存,然后将它们传送到响应中。这是一个非常繁琐的方法,尤其是当您开始获取大量文件时,但它确实允许您直接控制应用程序中发生的情况。
  2. 您可以使用中间件服务器,如express.js,其中IMO更好方法来做你想做的事情。有大量的在这里使用快递在计算器上,this is a good example of a static server问题和答案这是你说怎么样

编辑

随着澄清问题的原因:

var body = fs.readFileSync('/default.htm'); 

结果思维该文件是在C:\default.htm是因为你使用的是绝对路径不是相对路径。如果您有:

var body = fs.readFileSync('./default.htm'); 

然后,它将知道你要相对于当前的工作目录进行操作。 /是从分区的根和./是从当前工作目录

+0

所以简而言之,使用UNIX的语法和网站的根是包含驱动器的根并没有映射,这是不可配置? – 2013-03-20 01:42:21

+0

这是开始变得有意义。我可以在操作系统级重新映射,所以真的没有必要让服务器复杂化。所以他们选择了KISS。我实际上*没有意识到这是第一次,这让我感到困惑。 – 2013-03-20 01:47:04

+0

'readFile'和'readFileSync'仅仅是文件系统的读者。它们不是严格意义上的网络事物,因为node.js不是严格意义上的网络服务器。 – Joe 2013-03-20 01:56:47