node 创建静态文件服务器

2019-04-22  本文已影响0人  shadow123

创建静态文件服务器既要用到 Node 内置的功能,也要用第三方的 mime 附加模块来确定文件的 MIME 类型。

先从程序的主文件开始,请在项目根目录下创建 server.js 文件,使用 Node 中跟 HTTP 相关的功能、跟文件系统交互的功能,以及确定文件 MIME 类型的功能。变量 cache 是用来缓存文件中的数据的。

var http = require('http');
var fs = require('fs');
var path = require('path');
var mime = require('mime');
var cache = {};

1.发送文件数据及错误响应

接下来要添加三个辅助函数以提供静态HTTP文件服务。第一个是在所请求的文件不存在时发送404错误的。把下面的辅助函数加到 server.js 中:

function send404(response) {
    response.writeHead(404, { 'Content-Type': 'text/plain' });
    response.write('Error 404: resource not found');
    response.end();
}

第二个辅助函数提供文件数据服务。这个函数先写出正确的HTTP头,然后发送文件的内容。把下面的代码添加到 server.js 中:

function sendFile(response, filePath, fileContents) {
    response.writeHead(200, { "Content-Type": mime.getType(path.basename(filePath)) });
    response.end(fileContents);
}

访问内存(RAM)要比访问文件系统快得多,所以Node程序通常会把常用的数据缓存到内存里。只有第一次访问的时候才会从文件系统中读取。下一个辅助函数会确定文件是否缓存了,如果是,就返回它。如果文件还没被缓存,它会从硬盘中读取并返回它。如果文件不存在,则返回一个HTTP 404错误作为响应。把这个辅助函数加到server.js 中:

function serveStatic(response, cache, absPath) {
    if (cache[absPath]) {
        sendFile(response, absPath, cache[absPath])
    } else {
        fs.exists(absPath, function(exists) {
            if (exists) {
                fs.readFile(absPath, function(err, data) {
                    if (err) {
                        send404(response)
                    } else {
                        cache[absPath] = data
                        sendFile(response, absPath, data)
                    }
                })
            } else {
                send404(response)
            }
        })
    }
}
  1. 创建HTTP服务器

在创建HTTP服务器时,需要给 createServer 传入一个匿名函数作为回调函数,由它来处理每个HTTP请求。这个回调函数接受两个参数: requestresponse 。在这个回调执行时,HTTP 服务器会分别组装这两个参数对象,以便你可以对请求的细节进行处理,并返回一个响应。

将下面代码清单中的逻辑添加到server.js中以创建HTTP服务器。

var server = http.createServer(function(request, response) {
    var filePath = false;
    if (request.url == '/') {
        filePath = 'public/index.html'
    } else {
        filePath = 'public' + request.url;
    }
    var absPath = './' + filePath;
    serveStatic(response, cache, absPath)
})

3.启动HTTP服务器

现在你已经写好了创建 HTTP 服务器的代码,但还没添加启动它的逻辑。添加下面这些代码,它会启动服务器,要求服务器监听 TCP/IP 端口 30003000 是随便选的,所有 1024 以上的未用端口应该都可以(如果在 Windows 上运行,1024以下的端口也行,或者在 LinuxOS X 中用 root 这样的特权用户启动程序也可以)。

server.listen(3000, function() {
    console.log("Server listening on port 3000")
})

在命令行中输入下面这条命令启动服务器:

node server

服务器运行起来后,在浏览器中访问 http://127.0.0.1:3000 ,如果遇到找不到的文件会激发 404 错误辅助函数,页面上会显示“Error 404: resource not found。”消息。记住,在命令行中按下Ctrl-C可以停止正在运行的服务器。

github代码链接

上一篇下一篇

猜你喜欢

热点阅读