node.js的http实现简单静态服务器

任务

用nodejs的http模块实现一个类似于Apache的静态服务器

模块导入

  1. fs模块:用于对静态资源文件的读取
  2. path模块:用于文件路径的拼接
  3. http模块:用于搭建服务端
  4. url模块:用于处理和解析URL
  5. mime:使客户端软件,区分不同种类的数据

注意:mime是第三方模块,需要安装:

npm i mime -S
const fs = require('fs');
const path = require('path');
const http = require('http');
const url = require('url');
const mime = require('mime');
//用来存放文件数据
var cache={
     };

创建服务

  • 用http创建一个服务,监听端口号3000
  • 通过urlpath模块获取请求路径中的文件名pathname
  • 根据文件名pathname来拼接本地public文件夹下的文件路径filepath
  • 通过serverStatic方法在客户端响应数据
const server = http.createServer(function (req, res) {
     

    var pathname = url.parse(req.url,true).pathname;

    var filepath = path.join(__dirname, '/public', pathname);

    serverStatic(res,cache,filepath);

}).listen(3000, function () {
     
    console.log('running...');
});

srevreStatic函数:


function serverStatic(res,cache,abspath) {
     
    if(cache[abspath]){
     
        sendFile(res,abspath,cache[abspath]);
    }else{
     
        fs.exists(abspath,function (result) {
     
            if(result){
     
                fs.readFile(abspath,function (err,data) {
     
                    if(err){
     
                        send404(res);
                    }else{
     
                        cache[abspath]= data;
                        sendFile(res,abspath,data);
                    }
                });
            }else{
     
                send404(res);
            }
        })
    }
}

注意:cache用来暂存文件的数据,当客户端第一次读取文件是数据被存储在cache中,当客户端再次读取相应文件时直接返回cache中的数据,提升服务器效率。

sendFile方法:

function sendFile(res,filepath,filedata) {
     
    res.writeHead(200, {
      "Content-Type": mime.getType(path.basename(filepath)) });
    res.end(filedata);
}

send404方法:


function sendFile(res,filepath,filedata) {
     
    res.writeHead(200, {
      "Content-Type": mime.getType(path.basename(filepath)) });
    res.end(filedata);
}

sendFilesend404方法对通过mimegetType()方法设置响应头,使客户端浏览器可以响应不同类型的文件

你可能感兴趣的:(node.js,nodejs,http,node.js)