Node.js动手撸一个静态资源服务器的方法

以下是Node.js动手撸一个静态资源服务器的完整攻略:

什么是静态资源服务器

静态资源服务器是一个可以将静态文件(如 HTML,CSS,JavaScript,图片等)通过 HTTP 服务器向客户端提供这些文件的服务器。这种服务器通常是非常简单的,只是通过 HTTP 将文件发送给客户端,而不做任何处理。

构建静态资源服务器

要构建一个静态资源服务器,需要完成以下步骤:

  1. 初始化 Node.js 项目
  2. 安装并使用 httpfs 模块读取文件
  3. 处理 HTTP 请求,处理404错误

初始化 Node.js 项目

首先,需要创建一个新的 Node.js 项目。打开终端并输入以下命令:

mkdir static-server
cd static-server
npm init

按照提示回答 npm init 的问题,生成 package.json 文件。

安装并使用 httpfs 模块读取文件

要处理 HTTP 请求并向客户端发送静态文件,我们需要使用 http 模块和 fs 模块。这些模块都是 Node.js 自带的,无需安装。

使用以下代码来启动 http 服务器:

const http = require('http');
const fs = require('fs');
const path = require('path');

const port = 3000; // 服务器端口
const filePath = './'; // 服务器静态文件存放路径

const server = http.createServer((req, res) => {
  const url = req.url;
  let filename = '';

  if (url === '/') {
    filename = 'index.html'; // 如果请求的是根路径,则默认返回 index.html
  } else {
    filename = url.slice(1); // 否则获取请求的路径,并去掉前面的斜杠
  }

  const fileUrl = path.join(filePath, filename); // 将静态文件存放路径和请求的路径拼接起来

  fs.readFile(fileUrl, (err, data) => {
    if (err) {
      res.statusCode = 404; // 如果找不到文件,返回 404 状态码
      res.end('404 Not Found');
    } else {
      const ext = path.parse(filename).ext; // 获取文件扩展名
      const contentType = getContentType(ext); // 获取文件内容类型

      res.setHeader('Content-Type', contentType); // 设置响应头
      res.statusCode = 200; // 设置状态码
      res.end(data); // 返回文件内容
    }
  });
});

server.listen(port, () => {
  console.log(`Server running at http://localhost:${port}/`);
});

function getContentType(ext) { // 根据文件扩展名返回相应的 MIME 类型
  const mimeTypes = {
    '.html': 'text/html',
    '.css': 'text/css',
    '.js': 'text/javascript',
    '.json': 'application/json',
    '.png': 'image/png',
    '.jpg': 'image/jpeg',
    '.gif': 'image/gif',
    '.svg': 'image/svg+xml',
    '.wav': 'audio/wav',
    '.mp3': 'audio/mpeg',
    '.pdf': 'application/pdf',
    '.doc': 'application/msword',
    '.eot': 'application/vnd.ms-fontobject',
    '.ttf': 'application/font-sfnt'
  };

  return mimeTypes[ext] || 'application/octet-stream';
}

这段代码创建了一个基本的 http 服务器,监听在 3000 端口,当服务器收到请求时,它将返回客户端请求的静态文件。其中,http.createServer 接受一个回调函数,当请求到达时,将发送到此回调函数中。

在回调函数中,我们首先根据客户端请求的 URL 来确定要获取的文件。如果没有特定的文件名,则默认返回 index.html。然后,我们将获取的文件名称拼接到文件路径中,使用 fs 模块读取文件内容。

如果文件不存在,则返回 404 状态码。否则,我们确定返回的文件类型,并设置响应头,最后向客户端发送文件内容。在这里,我们通过 getContentType 函数确定文件类型,并在响应头中设置相应的 MIME 类型。

处理 HTTP 请求,处理404错误

在上一步的代码中,如果客户端请求了不存在的文件,则会默认返回 404 Not Found 错误。然而,如果我们向客户端发送的信息只是纯文本,那么无法正确地表达错误状态。我们应该让我们自己的服务器可以显示错误页面。

我们可以提供一个错误页面来代替纯文本错误信息。我们只需在文件末尾添加以下代码:

// 处理其他所有文件请求
server.on('request', (req, res) => {
  console.log(`URL: ${req.url}`);
});

// 返回 404 页面
function handle404(req, res) {
  const notFoundPath = path.join(filePath, '/404.html');

  fs.readFile(notFoundPath, (err, data) => {
    if (err) {
      res.statusCode = 404;
      res.setHeader('Content-Type', 'text/plain');
      res.end('404 Not Found');
    } else {
      res.statusCode = 404;
      res.setHeader('Content-Type', 'text/html');
      res.end(data);
    }
  });
}

// 如果请求的是不存在的文件,返回 404 页面
server.on('request', (req, res) => {
  const url = req.url;
  let filename = '';

  if (url === '/') {
    filename = 'index.html';
  } else {
    filename = url.slice(1);
  }

  const fileUrl = path.join(filePath, filename);

  if (!fs.existsSync(fileUrl)) {
    handle404(req, res);
    return;
  }

  fs.readFile(fileUrl, (err, data) => {
    if (err) {
      handle404(req, res);
    } else {
      const ext = path.parse(filename).ext;
      const contentType = getContentType(ext);

      res.setHeader('Content-Type', contentType);
      res.statusCode = 200;
      res.end(data);
    }
  });
});

这段代码使用了 Node.js 的 EventEmitter 模块中的 on 方法。当用户请求 /404 时,我们会返回一个错误页面。如果用户请求了一个不存在的页面,则返回错误页面。

我们处理 404 页面的方式是读取 404.html 文件,并将其作为 HTML 发送到浏览器。如果读取文件过程中出现错误,则我们将服务停止。

示例说明

这里提供两个示例

示例一:显示 HTML 文件

假设服务器上有一个名为 index.html 的 HTML 文件。当您启动 Node.js 服务器时,您应该能够通过在任何与 index.html 位于同一目录中的浏览器上打开相应的服务 URL,来查看此文件。例如,我们可以使用浏览器访问 http://localhost:3000,就会自动跳转到 index.html 页面。

示例二:提供静态资源

假设服务器上有一个图片文件 test.jpg,该文件在 ./image 目录中。当您启动服务器时,访问 http://localhost:3000/image/test.jpg,就会自动显示该图片。

以上就是使用 Node.js 构建一个静态资源服务器的完整攻略,希望对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Node.js动手撸一个静态资源服务器的方法 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • mysql中常用日期比较与计算函数

    MySQL是一种非常流行的数据库管理系统,它提供了许多处理日期和时间的函数。下面我将为你详细讲解MySQL中常用日期比较与计算函数的使用方法。 函数介绍 MySQL中常用的日期比较与计算函数包括日期比较函数和日期计算函数。下面是这些函数的具体介绍: 日期比较函数 1. 日期比较函数DATEDIFF() DATEDIFF()函数用于计算两个日期之间相差的天数。…

    database 2023年5月22日
    00
  • 一起raid数据恢复及回迁成功的案例

    关于“一起raid数据恢复及回迁成功的案例”的攻略,我将分为以下几个步骤进行讲解: 1. 了解 RAID RAID是指“Redundant Array of Independent Disks”,也就是独立磁盘冗余阵列。它通过将多块硬盘组合成一个数据存储单元,以提高数据读写速度和数据冗余度。因此,在操作 RAID 时,我们需要清楚其不同的级别和操作方式,包括…

    database 2023年5月22日
    00
  • mysql如何查询日期与时间

    MySQL提供了多种方法可以查询日期与时间,以下是两种常用的示例: 方法1: 使用DATE_FORMAT函数格式化日期和时间 使用DATE_FORMAT函数可以将日期和时间以字符串格式输出,具体语法为: SELECT DATE_FORMAT(date_column, format_string) FROM table_name 其中,date_column参…

    database 2023年5月22日
    00
  • 浅谈mysql的中文乱码问题

    当我们在 MySQL 中存储或读取中文时,常常会遇到乱码问题。下面我将为大家介绍一些常见的中文乱码问题及解决方案。 问题一:插入中文数据时出现乱码 如果您在插入中文数据时出现了乱码,一般是由于以下原因: 字符集不匹配 数据库连接是二进制协议而不是文本协议 字符编码问题 其中,最常见的是字符集不匹配。MySQL 默认使用的字符集是 latin1,而大多数情况下…

    database 2023年5月22日
    00
  • Python中Scrapy+adbapi提高数据库写入效率实现

    让我为您详细讲解“Python中Scrapy+adbapi提高数据库写入效率实现”的完整攻略。 1. Scrapy简介 Scrapy是一个开源的Python网络爬虫框架,它可以轻松地从网页中提取所需要的数据。Scrapy自带的Item Pipeline功能可以方便地将爬取到的数据存储到各种类型的数据库中。 2. adbapi介绍 adbapi是Twisted…

    database 2023年5月21日
    00
  • python使用pipeline批量读写redis的方法

    下面是关于“python使用pipeline批量读写redis的方法”的完整攻略: 什么是Pipeline 在使用redis进行批量操作时,通常我们会采用pipeline方法,也称作管道,可以将多次操作组合成一个批次执行,极大地提升了redis的操作效率。Python的redis模块中也提供了pipeline支持,可以使用pipeline对象进行批量操作。 …

    database 2023年5月22日
    00
  • Mysql事物锁等待超时Lock wait timeout exceeded;的解决

    Mysql事物锁等待超时是指在Mysql的事务处理过程中,一个事务因为获取锁等待超时而被阻塞,这种情况会导致事务无法执行而出现异常。下面来详细讲解一下如何解决这个问题。 什么是Mysql事物锁等待超时 MySQL的事务隔离级别是通过锁机制来实现的,这个锁机制包括表级锁和行级锁两种,其中行级锁是通过InnoDB存储引擎来实现的。 当多个事务对同一行记录进行修改…

    database 2023年5月18日
    00
  • ubuntu kylin 14.10下多个mysql 5.7.14安装教程

    Ubuntu Kylin 14.10下多个mysql 5.7.14安装教程 介绍 本文将介绍在Ubuntu Kylin 14.10操作系统下如何安装多个 mysql 版本为 5.7.14 的方法。 准备工作 在开始之前,需要先卸载掉当前系统中已经安装的 mysql,以免和即将安装的版本产生不必要的冲突。 sudo apt-get purge mysql-se…

    database 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部