美文网首页
node 创建静态文件服务器

node 创建静态文件服务器

作者: shadow123 | 来源:发表于2019-04-22 16:39 被阅读0次

    创建静态文件服务器既要用到 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代码链接

    相关文章

      网友评论

          本文标题:node 创建静态文件服务器

          本文链接:https://www.haomeiwen.com/subject/fqcugqtx.html