Node.js学习手册——一、Node.js没有web容器

735 阅读2分钟

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 图片:

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非常顶层路由设计。