Node.js不像Apache那样有根目录,也就是说Node.js本质上是没有web容器的。
本文重点:Node.js是如何让我们访问到html页面的
一、准备
在上文的helloworld.js所在的目录下新建文件render.js以及index.html
目录结构如下:
|--demo
|-index.html
|-helloworld.js
|-render.js
render.js文件中内容如下:
var http = require("http");
var fs = require("fs");
var server = http.createServer(function(req, res){
fs.readFile("./index.html", function(err, data){
res.writeHead(200, {"Content-type":"text/html;chartset=UTF-8"})
res.end(data)
})
})
server.listen(8080,"127.0.0.1")
启动之后,则可以返回index.html中的页面内容。
二、Node.js的顶层路由设计
为了让服务器能够根据不同的路由返回不同的页面内容,我们将render.js中的部分代码进行更改:
if(req.url == '/index'){
fs.readFile("./index.html", function(err, data){
res.writeHead(200, {"Content-type":"text/html;chartset=UTF-8"})
res.end(data)
})
}else if(req.url == '/demo'){
fs.readFile("./dmeo.html", function(err, data){
……
})
}else{
res.writeHead(404, {"Content-type":"text/html;chartset=UTF-8"})
res.end("no page")
}
从上述代码可以看到,Node.js的最有力的部分是其路由设计——顶层路由设计,根据不同的url地址,直接路由到相应的页面。根据浏览器中输入的url地址,是无法判断实际返回的页面到底是哪个。
Apache具有web容器,本身就可以直接将根目录下的各个项目的静态页面提供给用户访问,但是Node.js不行,在Node中则需要路由判断访问不同的页面。
三、Node.js中的图片
在/demo文件夹下放入 1.jpg 图片:

index.html页面:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<style type="text/css">
div {
width: 100px;
height: 100px;
background-color: cyan;
}
</style>
</head>
<body>
<div></div>
<!--添加图片-->
<img src="1.jpg" alt="#">
</body>
</html>
重新启动render.js,会发现页面只显示一个方块,图片并没有得到正确的显示:

出现这种原因其实是因为,我们在<img>标签中提供的图片地址是 1.jpg,也就是相当于我们在请求访问127.0.0.1:8080/1.jpg,也就是说在我们的程序中没有路径指向这张图片。
我们可以重新修改render.js的代码,为其增加一条指向图片的路径:
else if(req.url == '1.jpg'){
fs.readFile("./1.jpg", function(err, data){
res.writeHead(200, {"Content-type":"image/jpg"})
res.end(data)
})
}
重启项目之后,先访问127.0.0.1:8080/1.jpg,再访问127.0.0.1:8080/index,才能在页面中即看到图片又看到方块。如果这样做的话,需要对程序中的每一个url都进行顶层路由设计。if……else if……else if……
Node.js没有根目录的概念,因为它没有web容器
因此使用Node.js提供静态服务很难,每个静态文件都得写路由。
所以要对静态资源进行处理。
但是Node.js非常顶层路由设计。