node 之 apache

需要下载第三方模块 art-template

1
npm install art-template --save
1
2
3
4
5
6
7
8
var template = require('art-template');
var html = template(__dirname + '/tpl.art', {
    user: {
        name: 'aui',
        age:18
    }
});
console.log(html);

  

  

一.初步实现apache

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//初步实现apache功能
const http = require("http");
const fs = require("fs");
const path = require("path");
 
//任意目录地址
const wwwdir = "D:黑马文件就业班训练\nodeStyexpressapache";
 
const server = http.createServer();
server.listen("8808", () => {
  console.log("8808的服务端已经开启......");
});
 
server.on("request", function (req, res) {
  let url = req.url;
  if (url === "/") {
    fs.readFile(path.join(__dirname, "/index.html"), (err, data) => {
      if (err) {
        return res.end("404 not found");
      }
      res.end(data);
    });
  } else if (url === "/boy.html") {
    fs.readFile(path.join(__dirname, "/boy.html"), (err, data) => {
      if (err) {
        return res.end("404 not found");
      }
      res.end(data);
    });
  } else if (url === "/plus/login.html") {
    fs.readFile(path.join(__dirname, "/plus/login.html"), (err, data) => {
      if (err) {
        return res.end("404 not found");
      }
      res.end(data);
    });
  }
});

 

分析思考:

1/每一次请求都需要去判断if...else...

2/const url = req.url  //这句可以获取请求地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//初步实现apache功能
const http = require("http");
const fs = require("fs");
const path = require("path");
//创建服务
const server = http.createServer();
//启动服务
server.listen("8808", () => {
  console.log("8808的服务端已经开启......");
});
//监听请求
server.on("request", function (req, res) {
  const filePath = path.join(__dirname, req.url);
  let url = req.url;
  fs.readFile(filePath, (err, data) => {
    if (err) {
      return res.end("404 not found");
    }
    res.end(data);
  });
});

  

使用apache实例一个文件管理页面demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
const http = require("http");
const fs = require("fs");
const path = require("path");
const template = require("art-template");
//创建服务
const server = http.createServer();
//启动服务
server.listen("8808", () => {
  console.log("8808的服务端已经开启......");
});
//监听请求
server.on("request", function (req, res) {
  let url = req.url;
  let urlPath = path.join(__dirname, url);
 
  fs.stat(urlPath, (err, stats) => {
    if (err) {
      return res.end("404 not found");
    }
    console.log(stats.isFile());
    if (stats.isFile()) {
      //如果是普通文件
 
      fs.readFile(urlPath, function (err, data) {
        if (err) {
          return res.end("404 not found");
        }
        res.end(data);
      });
    } else if (stats.isDirectory()) {
      //表示一个文件系统目录,则返回true
      let templateStr = fs.readFileSync("./template.html").toString();
      let files = fs.readdirSync(urlPath);
 
      let htmlStr = template.render(templateStr, { files: files });
      res.end(htmlStr);
    }
  });

 

html页面

复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <title id="title">hello</title>
    <style>
      h1 {
        border-bottom: 1px solid #c0c0c0;
        margin-bottom: 10px;
        padding-bottom: 10px;
        white-space: nowrap;
      }

      table {
        border-collapse: collapse;
      }

      th {
        cursor: pointer;
      }

      td.detailsColumn {
        -webkit-padding-start: 2em;
        text-align: end;
        white-space: nowrap;
      }

      a.icon {
        -webkit-padding-start: 1.5em;
        text-decoration: none;
      }

      a.icon:hover {
        text-decoration: underline;
      }

      a.file {
        background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAABnRSTlMAAAAAAABupgeRAAABHUlEQVR42o2RMW7DIBiF3498iHRJD5JKHurL+CRVBp+i2T16tTynF2gO0KSb5ZrBBl4HHDBuK/WXACH4eO9/CAAAbdvijzLGNE1TVZXfZuHg6XCAQESAZXbOKaXO57eiKG6ft9PrKQIkCQqFoIiQFBGlFIB5nvM8t9aOX2Nd18oDzjnPgCDpn/BH4zh2XZdlWVmWiUK4IgCBoFMUz9eP6zRN75cLgEQhcmTQIbl72O0f9865qLAAsURAAgKBJKEtgLXWvyjLuFsThCSstb8rBCaAQhDYWgIZ7myM+TUBjDHrHlZcbMYYk34cN0YSLcgS+wL0fe9TXDMbY33fR2AYBvyQ8L0Gk8MwREBrTfKe4TpTzwhArXWi8HI84h/1DfwI5mhxJamFAAAAAElFTkSuQmCC ")
          left top no-repeat;
      }

      a.dir {
        background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAd5JREFUeNqMU79rFUEQ/vbuodFEEkzAImBpkUabFP4ldpaJhZXYm/RiZWsv/hkWFglBUyTIgyAIIfgIRjHv3r39MePM7N3LcbxAFvZ2b2bn22/mm3XMjF+HL3YW7q28YSIw8mBKoBihhhgCsoORot9d3/ywg3YowMXwNde/PzGnk2vn6PitrT+/PGeNaecg4+qNY3D43vy16A5wDDd4Aqg/ngmrjl/GoN0U5V1QquHQG3q+TPDVhVwyBffcmQGJmSVfyZk7R3SngI4JKfwDJ2+05zIg8gbiereTZRHhJ5KCMOwDFLjhoBTn2g0ghagfKeIYJDPFyibJVBtTREwq60SpYvh5++PpwatHsxSm9QRLSQpEVSd7/TYJUb49TX7gztpjjEffnoVw66+Ytovs14Yp7HaKmUXeX9rKUoMoLNW3srqI5fWn8JejrVkK0QcrkFLOgS39yoKUQe292WJ1guUHG8K2o8K00oO1BTvXoW4yasclUTgZYJY9aFNfAThX5CZRmczAV52oAPoupHhWRIUUAOoyUIlYVaAa/VbLbyiZUiyFbjQFNwiZQSGl4IDy9sO5Wrty0QLKhdZPxmgGcDo8ejn+c/6eiK9poz15Kw7Dr/vN/z6W7q++091/AQYA5mZ8GYJ9K0AAAAAASUVORK5CYII= ")
          left top no-repeat;
      }

      a.up {
        background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAmlJREFUeNpsU0toU0EUPfPysx/tTxuDH9SCWhUDooIbd7oRUUTMouqi2iIoCO6lceHWhegy4EJFinWjrlQUpVm0IIoFpVDEIthm0dpikpf3ZuZ6Z94nrXhhMjM3c8895977BBHB2PznK8WPtDgyWH5q77cPH8PpdXuhpQT4ifR9u5sfJb1bmw6VivahATDrxcRZ2njfoaMv+2j7mLDn93MPiNRMvGbL18L9IpF8h9/TN+EYkMffSiOXJ5+hkD+PdqcLpICWHOHc2CC+LEyA/K+cKQMnlQHJX8wqYG3MAJy88Wa4OLDvEqAEOpJd0LxHIMdHBziowSwVlF8D6QaicK01krw/JynwcKoEwZczewroTvZirlKJs5CqQ5CG8pb57FnJUA0LYCXMX5fibd+p8LWDDemcPZbzQyjvH+Ki1TlIciElA7ghwLKV4kRZstt2sANWRjYTAGzuP2hXZFpJ/GsxgGJ0ox1aoFWsDXyyxqCs26+ydmagFN/rRjymJ1898bzGzmQE0HCZpmk5A0RFIv8Pn0WYPsiu6t/Rsj6PauVTwffTSzGAGZhUG2F06hEc9ibS7OPMNp6ErYFlKavo7MkhmTqCxZ/jwzGA9Hx82H2BZSw1NTN9Gx8ycHkajU/7M+jInsDC7DiaEmo1bNl1AMr9ASFgqVu9MCTIzoGUimXVAnnaN0PdBBDCCYbEtMk6wkpQwIG0sn0PQIUF4GsTwLSIFKNqF6DVrQq+IWVrQDxAYQC/1SsYOI4pOxKZrfifiUSbDUisif7XlpGIPufXd/uvdvZm760M0no1FZcnrzUdjw7au3vu/BVgAFLXeuTxhTXVAAAAAElFTkSuQmCC ")
          left top no-repeat;
      }

      html[dir="rtl"] a {
        background-position-x: right;
      }

      #parentDirLinkBox {
        margin-bottom: 10px;
        padding-bottom: 10px;
      }

      #listingParsingErrorBox {
        border: 1px solid black;
        background: #fae691;
        padding: 10px;
        display: none;
      }
    </style>
  </head>

  <body>
    <div id="listingParsingErrorBox">
      糟糕!Google Chrome无法解读服务器所发送的数据。请<a
        href="http://code.google.com/p/chromium/issues/entry"
        >报告错误</a
      >,并附上<a href="LOCATION">原始列表</a></div>
    <h1 id="header">www 目录</h1>
    <div id="parentDirLinkBox" style="display: none">
      <a id="parentDirLink" class="icon up">
        <span id="parentDirText">[上级目录]</span>
      </a>
    </div>
    <table>
      <thead>
        <tr class="header" id="theader">
          <th onclick="javascript:sortTable(0);">名称</th>
          <th class="detailsColumn" onclick="javascript:sortTable(1);">大小</th>
          <th class="detailsColumn" onclick="javascript:sortTable(2);">
            修改日期
          </th>
        </tr>
      </thead>
      <tbody id="tbody">
        {{each files}}
        <tr>
          <td data-value="apple/">
            <a class="icon dir" href="{{$value}}">{{$value}}</a>
          </td>
          <td class="detailsColumn" data-value="0"></td>
          <td class="detailsColumn" data-value="1509589967">
            2017/11/2 上午10:32:47
          </td>
        </tr>
        {{/each}}
      </tbody>
    </table>
  </body>
</html>
复制代码
复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <title id="title">hello</title>
    <style>
      h1 {
        border-bottom: 1px solid #c0c0c0;
        margin-bottom: 10px;
        padding-bottom: 10px;
        white-space: nowrap;
      }

      table {
        border-collapse: collapse;
      }

      th {
        cursor: pointer;
      }

      td.detailsColumn {
        -webkit-padding-start: 2em;
        text-align: end;
        white-space: nowrap;
      }

      a.icon {
        -webkit-padding-start: 1.5em;
        text-decoration: none;
      }

      a.icon:hover {
        text-decoration: underline;
      }

      a.file {
        background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAABnRSTlMAAAAAAABupgeRAAABHUlEQVR42o2RMW7DIBiF3498iHRJD5JKHurL+CRVBp+i2T16tTynF2gO0KSb5ZrBBl4HHDBuK/WXACH4eO9/CAAAbdvijzLGNE1TVZXfZuHg6XCAQESAZXbOKaXO57eiKG6ft9PrKQIkCQqFoIiQFBGlFIB5nvM8t9aOX2Nd18oDzjnPgCDpn/BH4zh2XZdlWVmWiUK4IgCBoFMUz9eP6zRN75cLgEQhcmTQIbl72O0f9865qLAAsURAAgKBJKEtgLXWvyjLuFsThCSstb8rBCaAQhDYWgIZ7myM+TUBjDHrHlZcbMYYk34cN0YSLcgS+wL0fe9TXDMbY33fR2AYBvyQ8L0Gk8MwREBrTfKe4TpTzwhArXWi8HI84h/1DfwI5mhxJamFAAAAAElFTkSuQmCC ")
          left top no-repeat;
      }

      a.dir {
        background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAd5JREFUeNqMU79rFUEQ/vbuodFEEkzAImBpkUabFP4ldpaJhZXYm/RiZWsv/hkWFglBUyTIgyAIIfgIRjHv3r39MePM7N3LcbxAFvZ2b2bn22/mm3XMjF+HL3YW7q28YSIw8mBKoBihhhgCsoORot9d3/ywg3YowMXwNde/PzGnk2vn6PitrT+/PGeNaecg4+qNY3D43vy16A5wDDd4Aqg/ngmrjl/GoN0U5V1QquHQG3q+TPDVhVwyBffcmQGJmSVfyZk7R3SngI4JKfwDJ2+05zIg8gbiereTZRHhJ5KCMOwDFLjhoBTn2g0ghagfKeIYJDPFyibJVBtTREwq60SpYvh5++PpwatHsxSm9QRLSQpEVSd7/TYJUb49TX7gztpjjEffnoVw66+Ytovs14Yp7HaKmUXeX9rKUoMoLNW3srqI5fWn8JejrVkK0QcrkFLOgS39yoKUQe292WJ1guUHG8K2o8K00oO1BTvXoW4yasclUTgZYJY9aFNfAThX5CZRmczAV52oAPoupHhWRIUUAOoyUIlYVaAa/VbLbyiZUiyFbjQFNwiZQSGl4IDy9sO5Wrty0QLKhdZPxmgGcDo8ejn+c/6eiK9poz15Kw7Dr/vN/z6W7q++091/AQYA5mZ8GYJ9K0AAAAAASUVORK5CYII= ")
          left top no-repeat;
      }

      a.up {
        background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAmlJREFUeNpsU0toU0EUPfPysx/tTxuDH9SCWhUDooIbd7oRUUTMouqi2iIoCO6lceHWhegy4EJFinWjrlQUpVm0IIoFpVDEIthm0dpikpf3ZuZ6Z94nrXhhMjM3c8895977BBHB2PznK8WPtDgyWH5q77cPH8PpdXuhpQT4ifR9u5sfJb1bmw6VivahATDrxcRZ2njfoaMv+2j7mLDn93MPiNRMvGbL18L9IpF8h9/TN+EYkMffSiOXJ5+hkD+PdqcLpICWHOHc2CC+LEyA/K+cKQMnlQHJX8wqYG3MAJy88Wa4OLDvEqAEOpJd0LxHIMdHBziowSwVlF8D6QaicK01krw/JynwcKoEwZczewroTvZirlKJs5CqQ5CG8pb57FnJUA0LYCXMX5fibd+p8LWDDemcPZbzQyjvH+Ki1TlIciElA7ghwLKV4kRZstt2sANWRjYTAGzuP2hXZFpJ/GsxgGJ0ox1aoFWsDXyyxqCs26+ydmagFN/rRjymJ1898bzGzmQE0HCZpmk5A0RFIv8Pn0WYPsiu6t/Rsj6PauVTwffTSzGAGZhUG2F06hEc9ibS7OPMNp6ErYFlKavo7MkhmTqCxZ/jwzGA9Hx82H2BZSw1NTN9Gx8ycHkajU/7M+jInsDC7DiaEmo1bNl1AMr9ASFgqVu9MCTIzoGUimXVAnnaN0PdBBDCCYbEtMk6wkpQwIG0sn0PQIUF4GsTwLSIFKNqF6DVrQq+IWVrQDxAYQC/1SsYOI4pOxKZrfifiUSbDUisif7XlpGIPufXd/uvdvZm760M0no1FZcnrzUdjw7au3vu/BVgAFLXeuTxhTXVAAAAAElFTkSuQmCC ")
          left top no-repeat;
      }

      html[dir="rtl"] a {
        background-position-x: right;
      }

      #parentDirLinkBox {
        margin-bottom: 10px;
        padding-bottom: 10px;
      }

      #listingParsingErrorBox {
        border: 1px solid black;
        background: #fae691;
        padding: 10px;
        display: none;
      }
    </style>
  </head>

  <body>
    <div id="listingParsingErrorBox">
      糟糕!Google Chrome无法解读服务器所发送的数据。请<a
        href="http://code.google.com/p/chromium/issues/entry"
        >报告错误</a
      >,并附上<a href="LOCATION">原始列表</a></div>
    <h1 id="header">www 目录</h1>
    <div id="parentDirLinkBox" style="display: none">
      <a id="parentDirLink" class="icon up">
        <span id="parentDirText">[上级目录]</span>
      </a>
    </div>
    <table>
      <thead>
        <tr class="header" id="theader">
          <th onclick="javascript:sortTable(0);">名称</th>
          <th class="detailsColumn" onclick="javascript:sortTable(1);">大小</th>
          <th class="detailsColumn" onclick="javascript:sortTable(2);">
            修改日期
          </th>
        </tr>
      </thead>
      <tbody id="tbody">
        {{each files}}
        <tr>
          <td data-value="apple/">
            <a class="icon dir" href="{{$value}}">{{$value}}</a>
          </td>
          <td class="detailsColumn" data-value="0"></td>
          <td class="detailsColumn" data-value="1509589967">
            2017/11/2 上午10:32:47
          </td>
        </tr>
        {{/each}}
      </tbody>
    </table>
  </body>
</html>
复制代码

 

  

 参考网址:https://blog.csdn.net/lucky541788/article/details/83903964

 

 

 

  

posted @   zmztyas  阅读(106)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
历史上的今天:
2018-02-02 html页面使用前端框架布局时,弹出子页面等情况若出现布局混乱,可能是回发导致
点击右上角即可分享
微信分享提示