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日

相关文章

  • 一文搞懂高并发下的数据库事务隔离级别

    在高并发的场景下,数据库事务隔离级别非常重要,它影响了数据库并发操作的正确性、性能和可靠性。 数据库事务隔离级别分为四种: Read uncommitted(读未提交) Read committed(读已提交) Repeatable read(可重复读) Serializable(串行化) Read uncommitted(读未提交) 该隔离级别的数据库事务…

    Matplotlib 2023年3月10日
    00
  • 快速了解Java中NIO核心组件

    下面是快速了解Java中NIO核心组件的攻略。 一、什么是NIO NIO(New IO)是Java的一个核心组件,它是对经典IO的改进。NIO是Java 1.4引入的,它提供了与原来的IO几乎相同的功能,但是通过使用不同的方法和类却可以获得更好的性能。 二、NIO主要组件 Buffer(缓冲区):在NIO中,所有的数据都是被放置在缓冲区中的,缓冲区本质上是一…

    database 2023年5月21日
    00
  • MySQL数据库使用mysqldump导出数据详解

    MySQL是一个非常流行的关系型数据库管理系统,它具有高效、可靠、安全等特点。在实际的数据库操作过程中,我们常常需要备份和恢复数据。mysqldump命令是MySQL自带的备份工具,可以在快速、安全、方便地备份和还原MySQL数据库。 本篇文章将详细介绍如何使用mysqldump导出数据的完整攻略。 步骤一:连接到MySQL服务器 在使用mysqldump命…

    database 2023年5月18日
    00
  • CentOS 8安装ZABBIX4.4的指南

    以下是详细讲解“CentOS 8安装ZABBIX4.4的指南”的完整攻略。 1. 前置条件 在开始安装ZABBIX之前,您需要满足以下前提条件: 在CentOS 8操作系统上具有sudo权限的访问。 已经配置并启用了EPEL存储库。 2. 安装MariaDB ZABBIX需要使用数据库存储其数据。在本教程中,我们将使用MariaDB,它是一个免费的且开源的关…

    database 2023年5月22日
    00
  • MySQL异常处理浅析

    MySQL异常处理浅析 MySQL异常处理是开发过程中非常重要的一环,特别是在处理一些数据操作时,如果不进行异常处理,可能会导致程序出现错误甚至崩溃。在本篇攻略中,我们将分享MySQL异常处理的相关知识,包括异常的分类、异常处理方式以及常见的异常示例。 异常分类 MySQL异常可以分为两类:预期异常和非预期异常。 预期异常 预期异常是可以预见的,通常在代码早…

    database 2023年5月21日
    00
  • 解决MybatisPlus SqlServer OFFSET 分页问题

    下面就是关于“解决MybatisPlus SqlServer OFFSET 分页问题”的完整攻略: 问题描述 在使用 MybatisPlus 进行开发时,如果在 SqlServer 上使用 OFFSET 分页时,可能会遇到一些问题。问题的具体表现为在使用 OFFSET 分页时查询结果出现了多条重复的数据。 解决方法 针对上述问题,我们可以通过以下两种方式来解…

    database 2023年5月21日
    00
  • SQL查询方法精华集

    SQL查询方法精华集 简介 本文将介绍SQL查询方法的精华集,涵盖了常见的查询语句以及一些高级的查询方法。可以快速提高你在SQL查询方面的技能,适用于初学者和中级SQL使用者。 常见查询语句 1. SELECT语句 用于从表中获取数据。示例如下: SELECT * FROM 表名; 其中,*表示返回所有列;表名是你要查询的表名。 2. WHERE语句 用于指…

    database 2023年5月21日
    00
  • sql模式设置引起的问题解决办法

    关于“SQL模式设置引起的问题解决办法”的攻略,我会从以下几个方面进行详细讲解: SQL模式的概念 SQL模式设置引起的问题分析 SQL模式设置的修改方法 示例说明 1. SQL模式的概念 SQL模式是MySQL企业版默认启用的一种特性,它包含了一系列的参数配置,用于控制MySQL所使用的SQL语句、数据类型及操作的行为。你可以将SQL模式看做一种“规则集合…

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