node实现静态文件服务器

更新日期: 2019-03-24阅读量: 1733标签: 服务器

node 静态文件处理

一般后端进行静态文件处理都是使用 Apache nginx 等静态 web 服务器,但是既然使用 node 了,就用 node 实现以下静态服务器吧.

之前弄了不少充满艺术的数据,就弄个页面进行艺术欣赏吧

app.js

    "/": (request, response) => {
      response.writeHead(200, { "content-type": "text/html;charset=utf-8" });
      let stream = fs.createReadStream(
        path.join(__dirname, "/views/index.html")
      );
      stream.on("error", function() {
        response.writeHead(500, { "content-type": "text/html;charset=utf-8" });
        response.end("<h1>500 Server Error</h1>");
      });
      stream.pipe(response);
    },

views/index.html/index.js/index.css

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>时尚风范</title>
    <link rel="stylesheet" href="./index.css" type="text/css" />
    <script src="./index.js"></script>
  </head>
  <body>
    <div>
      <div>我是写真集</header>
    </div>
  </body>
</html>

技术图片
但是打开之后什么都不能看,css 和 js 在控制台都是 404 显示.因为服务器没有写相应的代码去处理这些文件,所以接收到请求,服务器也是一脸茫然,不知道究竟要干什么.

所有我们要对请求的资源做出相对应的回答,那怕是个 404

添加 css 和 js 的支持

"/index.css": (request, response) => {
      response.writeHead(200, { "content-type": "text/css;chartset=utf-8" });
      let stream = fs.createReadStream(
        path.join(__dirname, "/views/index.css")
      );
      stream.on("error", function() {
        response.writeHead(500, { "content-type": "text/html;charset=utf-8" });
        response.end("<h1>500 Server Error</h1>");
      });
      stream.pipe(response);
    },
    "/index.js": (request, response) => {
      response.writeHead(200, {
        "content-type": "text/javasvript;chartset=utf-8"
      });
      let stream = fs.createReadStream(
        path.join(__dirname, "/views/index.js")
      );
      stream.on("error", function() {
        response.writeHead(500, { "content-type": "text/html;charset=utf-8" });
        response.end("<h1>500 Server Error</h1>");
      });
      stream.pipe(response);
    },

这样就正常的加载和执行 css 和 js 了,但是代码灵活性不够,重复率太高.


静态资源服务器

区分路由

...
if (pathname !== "/favicon.ico") {
  if (path.extname(pathname) === "") {
    router(pathname)(request, response);
  } else {
    assets(pathname)(request, response);
  }
}
...

添加静态资源处理

function assets(p) {
  let ext = path.extname(p);
  ext = ext ? ext.slice(1) : "unknown";
  let contentType = getMime(ext);
  contentType += ";charset=utf-8";
  let filePath;

  if (/image/.test(contentType)) {
    filePath = path.join(static_path, p);
  } else {
    filePath = path.join(public_path, p);
  }

  return async function(request, response) {
    try {
      let stats = await stat(filePath);
      if (stats && stats.isFile()) {
        readFile(response, filePath, contentType);
      }
    } catch (err) {
      console.log(err);
    }
  };
}

我们需要根据文件类型做相应处理

对不同的文件进行不同的响应头处理

module.exports = {
  getMime: function(ext) {
    let mime = {
      css: "text/css",
      gif: "image/gif",
      html: "text/html",
      ico: "image/x-icon",
      jpeg: "image/jpeg",
      jpg: "image/jpeg",
      js: "text/javascript",
      json: "application/json",
      pdf: "application/pdf",
      png: "image/png",
      svg: "image/svg+xml",
      swf: "application/x-shockwave-flash",
      tiff: "image/tiff",
      txt: "text/plain",
      wav: "audio/x-wav",
      wma: "audio/x-ms-wma",
      wmv: "video/x-ms-wmv",
      xml: "text/xml"
    };
    return mime[ext] || "text/plain";
  }
};

加载相应的静态文件

function readFile(response, filePath, contentType) {
  response.writeHead(200, { "content-type": contentType });
  let stream = fs.createReadStream(filePath);
  stream.on("error", function() {
    response.writeHead(500, { "content-type": contentType });
    response.end("<h1>500 Server Error</h1>");
  });
  stream.pipe(response);
}

index.js

window.onload = function() {
  let path =
    "http://127.0.0.1:9527/mrw/%E5%B0%8F%E6%B2%AB%E7%90%B3%E3%80%8A%E8%8B%8F%E6%A2%85%E5%B2%9B%E6%97%85%E6%8B%8D%E5%86%99%E7%9C%9F%E3%80%8B%20[%E8%8A%B1%E3%81%AE%E9%A2%9CHuaYan]%20Vol.057%20%E5%86%99%E7%9C%9F%E9%9B%86/%E5%B0%8F%E6%B2%AB%E7%90%B3%E3%80%8A%E8%8B%8F%E6%A2%85%E5%B2%9B%E6%97%85%E6%8B%8D%E5%86%99%E7%9C%9F%E3%80%8B%20[%E8%8A%B1%E3%81%AE%E9%A2%9CHuaYan]%20Vol.057%20%E5%86%99%E7%9C%9F%E9%9B%86_image";

  let suffix = ".jpg";
  let content = document.createElement("div");
  let body = document.getElementsByTagName("body")[0];
  content.setAttribute("class", "content");

  for (let i = 0; i < 56; i++) {
    let item = document.createElement("img");
    item.setAttribute("src", `${path}${i}${suffix}`);
    content.appendChild(item);
  }
  body.appendChild(content);
};

技术图片

当然,正常的写真集不是这样做的,而是通过数据库存储硬盘路径存放地址,然后返回给前端 url+path 的形式,路径也不会这么长.这里只是处理静态文件.

原文地址:https://www.cnblogs.com/mybilibili/p/10585546.html 

 

链接: https://www.fly63.com/article/detial/2503

HTTP返回415请求错误Unsupported Media Type:415表示服务器无法处理请求附带的媒体格式

前端在调用外部API接口时返回Http是415的请求错误,这是415返回码是由于:服务器无法处理请求附带的媒体格式。通常解决方法有以下3种:1检查你的 http 请求头信息;2查看你的 http 请求方法;3post 请求参数设置

将本地启动一个HTTP服务器,映射到外网环境

需要启动一个HTTP服务来打开项目。我们可以使用 http-server 或者 web server for chrome 来解决这个问题。有时候,我们还想要外网也能访问我们本地的服务,这时候我们可以使用 ngrok 来解决这个问题。

网站服务器租用要注意什么?

网站服务器租用,对于现今很多互联网企业来说,一直都是一项非常不错的选择。但很多企业由于缺乏网站服务器租用技巧及经验,而导致网站在运营过程中出现非常多的问题影响业务发展。

睿江云“充一送一大返利”

中国领先的互联网基础服务提供商,致力于为全球的金融、电子商务、移动互联网、网络游戏、门户网站等企业提供专业的互联网数据中心(IDC)、云计算(私有云解决方案及公有云云平台)及行业应用的整体解决方案,是一家在业务领域专注和专业的云计算数据中心运营商。

Linux服务器---邮件服务openwebmail安装

openwebmail提供了可视化的邮件管理系统,它运行在Apache环境下。在官网下载openwebmail,解压,其中cgi-bin是要执行的程序,而data是数据部分。因此在后面我们要改的地方都集中在cgi-bin目录下的openwebmail

怎么租用网站服务器的步骤

网站服务器租用是指租用的服务器主要是用来放置企业网站。那么对于企业网站的服务器该如何选择呢,如何租用呢?价格如何?我来教教大家正确选择租用网站服务器,步骤如下:

中间件、服务器和Web服务器三者的区别

服务器指的是一个管理资源并为用户提供服务的计算机软件,通常分为文件服务器、数据库服务器和应用程序服务器。运行以上软件的计算机或计算机系统也被称为服务器。

web服务器的原理

我们最常说的Web服务器指的是网站服务器,它是建立在Internet之上并且驻留在某种计算机上的程序。Web服务器可以向Web客户端(如浏览器)提供文档或其他服务,只要是遵循HTTP协议而设计的网络应用程序都可以是Web客户端。

个人用户如何为自己的网站及应用选配云服务器

最近几年云服务器越来越普及,除了安全性要求特别高的业务之外,很多个人开发者以及企业都会选择购买一台云服务器作为自己的服务器,这样可以省去自己购买服务器的昂贵费用以及服务器机房维护的人员费用。

云主机有哪些优势?购买时要注意哪些?

使用云服务器的企业越来越多,各服务商竞争日益激烈。提醒各位站长们在挑选时要多留个心眼,仔细甄别,防患未然。希望对大家选购服务器有帮助。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!