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日

相关文章

  • 使用IDEA对Oracle数据库进行简单增删改查操作

    以下是使用IDEA对Oracle数据库进行简单增删改查操作的完整攻略。 1. 环境准备 安装JDK,建议版本为1.8以上; 安装IDEA,建议版本为2019.3以上; 安装Oracle数据库,建议版本为11g及以上; 下载ojdbc驱动。 2. 添加ojdbc驱动到项目中 将下载好的ojdbc驱动拷贝到项目中,并在IDEA中引入依赖。 <depende…

    database 2023年5月21日
    00
  • win下安装Redmine常见错误及解决方法

    如有人要在win下安装Redmine,可能会遇到一些常见错误,以下是针对常见错误的解决方法: 安装Ruby时无法联网 如果在安装Ruby过程中,打开命令提示符输入以下命令却出现错误: ruby -v 通常表示Ruby无法联网,此时需要使用代理进行联网,可以在命令提示符上使用以下命令: set http_proxy=http://proxyserver:por…

    database 2023年5月22日
    00
  • DBA必备的Mysql知识点:数据类型和运算符

    摘要:本文主要为大家带来Mysql中的3种数据类型和3种运算符。 本文分享自华为云社区《Mysql中的数据类型和运算符》,作者: 1+1=王。 Mysql的数据类型 Mysql支持数值型、文本型和日期时间型三大数据类型。 数值型数据 数值型是描述定量数据的数据类型,包括整数型数据类型和浮点型数据类型。 整数型数据类型 整数型数据类型包括INTEGER、SMA…

    MySQL 2023年4月11日
    00
  • 基于centos7快速安装mysql5.7教程解析

    以下是关于“基于CentOS 7快速安装MySQL 5.7教程解析”的完整攻略。 安装MySQL 5.7 第一步:添加MySQL 5.7 Yum源 首先,需要添加MySQL 5.7 Yum源,可以从MySQL官网获取。以下是添加MySQL 5.7 Yum源的示例: sudo wget https://repo.mysql.com/mysql57-commun…

    database 2023年5月22日
    00
  • 如何基于Springboot完成新增员工功能并设置全局异常处理器

    针对这个问题,我可以给你提供下面的攻略: 1. 创建Springboot项目和员工实体类 首先需要创建一个Springboot项目,具体可以使用IDEA或Eclipse等开发工具。在创建好的项目中,需要创建一个员工实体类,并添加id、name、age等字段,可以参考下面的代码示例: public class Employee { private Long i…

    database 2023年5月22日
    00
  • oracle覆盖导入dmp文件的2种方法

    下面我来详细讲解“oracle覆盖导入dmp文件的2种方法”的完整攻略。 1. 覆盖导入dmp文件的概述 在Oracle数据库中,如果已经存在同名的表或者数据,导入dmp文件时会直接报错。但是,有时候我们需要覆盖掉已经存在的表或数据,这时候就需要使用覆盖导入dmp文件的方法。下面分别介绍两种方法。 2. 第一种方法:使用impdp命令 2.1 导出原数据 首…

    database 2023年5月22日
    00
  • MySQL中UPDATE语句使用的实例教程

    针对“MySQL中UPDATE语句使用的实例教程”的完整攻略,我将从以下五个部分进行讲解: UPDATE语句的基本语法 使用UPDATE语句更新单个表中的数据 使用UPDATE语句更新多个表中的数据 使用UPDATE语句根据条件更新数据 UPDATE语句的注意事项 接下来,我将进入详细的讲解: 1. UPDATE语句的基本语法 UPDATE语句是MySQL中…

    database 2023年5月21日
    00
  • Oracle 临时表空间SQL语句的实现

    Oracle 临时表空间SQL语句的实现 为什么需要临时表空间? Oracle 数据库中的临时表空间用于存储一些临时数据,例如排序、聚合、分组等操作使用的临时表,以及一些特定的SQL语句(如创建索引、更新数据等)使用的临时表。 临时表空间可以在数据库创建时创建,并且可以动态地增加或缩小。对于一些需要大量使用磁盘空间的SQL操作来说,临时表空间的创建和配置将非…

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