iis服务器助手广告
返回顶部
首页 > 资讯 > 服务器 >Node.js开发静态资源服务器
  • 169
分享到

Node.js开发静态资源服务器

Node.js静态资源服务器Node.js静态资源 2022-11-13 14:11:41 169人浏览 安东尼
摘要

目录正文静态资源服务器模块化最后正文 在09年node.js出来后,让前端开发人员的开发路线变的不再那么单调,经过这么多年的发展,我们的开发基本已经离不开node.js,不管是用作于

正文

在09年node.js出来后,让前端开发人员的开发路线变的不再那么单调,经过这么多年的发展,我们的开发基本已经离不开node.js,不管是用作于工具类的开发,还是做完服务端的中间层,Node.js都占据了非常重要的地位,今天我们就一起通过原生的js+Node来实现一个简单的静态资源服务,如果你还不了解这方面的知识,那就跟我一起来学习吧!

静态资源服务器

Node.js经过这么多年的发展,已经有了很多很优秀的基础框架或类库,像express.jsKoa.jsegg.js等,它们都是基于原生的Node.js来实现的,而我们之所以不选择用这些框架,其实就是希望大家能够了解前面这几种框架是如何实现一个基础的静态资源服务的,只有当我们了解了这其中的知识点,再使用这些框架时才会更加得心应手,下面我们一起看一下这个基础的静态资源服务该如何开发吧!

首先,我们要了解的是,既然是要开发静态资源服务,那么什么是静态资源服务呢?简单来说就是可以静态访问的一个资源服务器,而这些静态资源包括但不限于类似htmlCSSjs以及一些图片资源,音视频等等。我们能通过网络直接访问这些内容,就是因为它们通过静态资源服务器将这些内容挂载在网上。

我们首先要做的就是创建一个服务,在Node中我们通过Http模块来创建一个服务,httpNode中的一个基础的api,相关的内容可以查阅官方文档,然后我们需要读取本地的资源,那么就需要用到另外一个模块fsfs模块能够操作本地的资源文件,具体的内容也可以通过官网的文档进行查看,下面我们一起来看一下相关的代码,代码如下:

const fs = require('fs');
const http = require('http');
http.createServer((req, res) => {
    fs.readFile(__dirname + req.url, (err, data) => {
        if (err) {
            res.writeHead(404, { 'Content-Type': 'text/html' });
            res.end('404: File not found');
        } else {
            res.writeHead(200, { 'Content-Type': 'text/html' });
            res.end(data);
        }
    });
}).listen(8000);

在上述的代码中,我们首先通过http.createServer创建了一个服务器,并且通过listen(8000)来监听了8000端口的服务,这样我们就可以直接在浏览器中通过访问localhost:8000来进行访问;在这个服务的内部,我们通过fs.readFile方法来读取文件,因为我们没有指定读取的具体内容,而是通过获取请求信息来判断我们要展示给用户看到的内容,所以最终会在页面中展示404,如下图所示:

上面的代码已经简单了实现了一个静态资源服务了,但是代码看起来就比较零散,下面我们一起来对这个代码进行改造,通过模块化的思想对代码进行升级,这样不至于让我们的代码看起来像面条代码。

模块化

首先,我们读取的文件地址可能跟我们的这个文件服务不在一个目录中,为了解决问题问题,我们需要修改我们的文件目录,而关于目录的相关信息,就不得不用到Node中另外一个很重要的模块path了。通过path模块,我们能够解析不同目录中的内容,一起来看一下修改后的代码吧,如下:

const fs = require('fs');
const path = require('path');
const directoryName = './public';
const requestUrl = 'index.html';
const filePath = path.join(directoryName, requestUrl);
fs.readFile(filePath, (err, data) => {
    // ...
});

我们通过path将静态资源的根目录拼接在一起,这样当我们使用fs.readFile来读取这个文件时,不至于因为路径错误而读取不到正确的内容。

接下来我们需要考虑的就是安全性的问题了,因为我们不希望用户能够在未授权的情况随意访问我们服务器中的任意资源,目前并不是不能访问除了指定的目录外的文件,这就是一个安全性的问题。为了解决这个问题,我们可以通过path模块来检测用户请求的文件是否是可以访问的,下面一起看看我们对上述代码的改造,如下:

const path = require('path');
const directoryName = './public';
const root = path.nORMalize(path.resolve(directoryName));
const requestUrl = 'index.html';
const filePath = path.join(root, fileName);
const isPathUnderRoot = path
    .normalize(path.resolve(filePath))
    .startsWith(root);

上述代码中,我们通过path.normalize来检测这个文件地址是否包含在根路径中,这样就能确保用户只能访问到我们允许访问的地址。同样的,我们还可以通过检查文件的类型来确保用户无法访问到一些敏感的文件。

为此,我们需要指定能够访问的文件类型的数组或对象,只有当用户访问的文件在这个数组或者对象中,才能展示给用户看到,因此我们还需要用到path模块来检查文件的后缀名,修改后代码如下:

const path = require('path');
const types = ['html', 'css', 'js', 'JSON'];
const requestUrl = 'index.html';
const extension = path.extname(requestUrl).slice(1);
const isTypeSupported = types.includes(extension);

我们定义了一个文件类型的数组,其中就包含了用户可以访问的资源类型,然后我们通过path.extname来检测用户请求的文件的后缀,只有在这个类型文件的数组包含的类型,才会展示给用户进行查看。

当然,当我们访问html的时候,我们一般都不会也不需要在浏览器中输入xxx.html这样的后缀,因此我们还需要对html这样的后缀做省略,让用户可以直接通过网址就能访问正确的页码,而不需要添加.html。下面我们一起看一下改造后的代码,如下:

const fs = require('fs');
const path = require('path');
const directoryName = './public';
const root = path.normalize(path.resolve(directoryName));
const extension = path.extname(req.url).slice(1);
let fileName = requestUrl;
if (requestUrl === '/') {
    fileName = 'index.html';
} else if (!extension) {
    try {
        fs.accessSync(path.join(root, requestUrl + '.html'), fs.constants.F_OK);
        fileName = requestUrl + '.html';
    } catch (e) {
        fileName = path.join(requestUrl, 'index.html');
    }
}

上述的代码中,我们通过判断用户访问的文件类型是否包含在前面的数组中,当用户访问的类型不包含时,我们通过fs.accessSync测试用户访问的文件是否是允许访问的,如果允许访问则直接返回一个.html的文件,如果用户访问的地址是不允许访问的,则直接返回index.html

最后,当我们将前面所有的内容都完成后,我们可以将这些内容都整合在一起,下面我们一起来看一下最终完成的这个静态资源服务的完整代码吧,如下:

const fs = require('fs');
const http = require('http');
const path = require('path');
// 静态资源服务器地址
const port = 8000;
// 静态资源文件夹
const directoryName = './public';
// 允许访问的文件类型
const types = {
    html: 'text/html',
    css: 'text/css',
    js: 'application/javascript',
    png: 'image/png',
    jpg: 'image/jpeg',
    jpeg: 'image/jpeg',
    gif: 'image/gif',
    json: 'application/json',
    xml: 'application/xml',
};
// 静态资源文件根路径
const root = path.normalize(path.resolve(directoryName));
// 创建静态资源服务器
const server = http.createServer((req, res) => {
    // 获取访问的文件类型
    const extension = path.extname(req.url).slice(1);
    // 文件类型后缀
    const type = extension ? types[extension] : types.html;
    // 是否支持的文件类型
    const supportedExtension = Boolean(type);
    // 如果这个文件类型不允许访问,则直接返回404
    if (!supportedExtension) {
        res.writeHead(404, { 'Content-Type': 'text/html' });
        res.end('404: File not found');
        return;
    }
    // 通过url获取访问的文件名称
    let fileName = req.url;
    // 如果访问的路径是 /
    if (req.url === '/') {
        // 则文件名是 index.html
        fileName = 'index.html';
    } else if (!extension) {
        try {
            // 检测文件是否允许访问
            fs.accessSync(path.join(root, req.url + '.html'), fs.constants.F_OK);
            // 当允许访问时,则返回对应的页面
            fileName = req.url + '.html';
        } catch (e) {
            // 否则直接返回 index.html
            fileName = path.join(req.url, 'index.html');
        }
    }
    const filePath = path.join(root, fileName);
    const isPathUnderRoot = path.normalize(path.resolve(filePath)).startsWith(root);
    if (!isPathUnderRoot) {
        res.writeHead(404, { 'Content-Type': 'text/html' });
        res.end('404: File not found');
        return;
    }
    fs.readFile(filePath, (err, data) => {
        if (err) {
            res.writeHead(404, { 'Content-Type': 'text/html' });
            res.end('404: File not found');
        } else {
            res.writeHead(200, { 'Content-Type': type });
            res.end(data);
        }
    });
});
server.listen(port, () => {
    console.log(`Server is listening on port ${port}`);
});

最终我们通过不到100行的代码就实现了这个静态资源服务,我们可以看一下具体的运行效果。

当我们访问首页时,就直接展示默认的index.html中的文件,如果我们访问的内容不允许访问,则直接显示404,如下所示:

最后

我们只通过Node.js中一些简单的API就开发了一个基础的静态资源服务器,也让大家了解了一些Node.js相关的基础操作,了解这些基础的操作不仅有利于提高我们自身的知识储备,也更有利于我们在实际开发中少踩一些坑。

以上就是Node.js开发静态资源服务器的详细内容,更多关于Node.js静态资源服务器的资料请关注编程网其它相关文章!

--结束END--

本文标题: Node.js开发静态资源服务器

本文链接: https://www.lsjlt.com/news/172126.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Node.js开发静态资源服务器
    目录正文静态资源服务器模块化最后正文 在09年Node.js出来后,让前端开发人员的开发路线变的不再那么单调,经过这么多年的发展,我们的开发基本已经离不开Node.js,不管是用作于...
    99+
    2022-11-13
    Node.js静态资源服务器 Node.js静态资源
  • 网页开发中静态资源与动态资源的区别
    一、内容变化的区别 静态资源:静态资源通常是预先创建好的,其内容在服务器启动后就已经确定,不会因为用户的请求而改变。如HTML、CSS、JavaScript文件、图片等。 动态资源:动态资源的内容则是在接收到用户请求后,由服务器...
    99+
    2023-10-29
    资源 静态 区别
  • 如何使用Node.js实现一个静态资源服务器
    今天就跟大家聊聊有关如何使用Node.js实现一个静态资源服务器,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。项目涉及...
    99+
    2024-04-02
  • nodejs搭建静态资源服务器
    随着互联网的发展,Web开发在全球范围内已经成为了一项非常热门的行业,对于开发人员来说,为了能够快速有效地开发并发布代码,需要有一个静态资源服务器来帮助我们管理和处理静态资源,特别是在前后端分离的开发模式中使用频率较高,而Node.js发布...
    99+
    2023-05-14
  • nginx静态资源的服务器配置方法
    目录一、nginx 作用二、nginx 静态HTTP服务器配置三、nginx HTTP服务器(动静分离--nginx+tomcat实现动静分离)四、 反向代理----使用proxy_...
    99+
    2024-04-02
  • 访问服务器上的静态资源(图片等)
    目录 1、在服务器上安装tomcat 2、将图片上传到服务器上 3、在tomcat中进行配置 添加代码(docBase是放图片的文件夹,path是映射地址) 4、访问路径 1、在服务器上安装tomcat 安装教程在另一篇博客有记录 ht...
    99+
    2023-09-14
    服务器 运维
  • 阿里云静态资源服务器怎么用的啊
    简介 阿里云静态资源服务器是一种用于存储和分发静态资源的解决方案,可以帮助开发人员更高效地管理和发布网站内容。本文将介绍如何使用阿里云静态资源服务器,并提供一些实际应用的例子。使用步骤步骤一:创建静态资源服务器实例在阿里云控制台上,选择合适...
    99+
    2024-01-18
    阿里 静态 服务器
  • 如何使用PHP开发缓存优化静态资源加载
    如何使用PHP开发缓存优化静态资源加载简介:在网页开发中,静态资源如图片、CSS样式表和JavaScript脚本文件等往往会占据大部分的加载时间。对于大型网站或者高并发访问的网站来说,如何优化静态资源的加载速度是一个重要的问题。本文将介绍如...
    99+
    2023-11-07
    PHP开发技巧 PHP缓存优化 静态资源加载
  • 阿里云静态资源服务器地址是什么?
    随着互联网技术的发展,网站和应用程序的开发已经成为了许多企业和个人的日常。在这个过程中,静态资源的处理和存储是一个非常重要的环节。阿里云作为国内领先的云计算服务提供商,提供了一系列的静态资源服务器服务,可以帮助企业和个人轻松地管理和存储静态...
    99+
    2023-11-12
    阿里 静态 地址
  • CentOS搭建web服务器的动态缓存与静态资源优化
    在CentOS上搭建Web服务器时,可以采取以下措施来进行动态缓存和静态资源优化:1. 使用缓存插件:安装和配置缓存插件,如Varn...
    99+
    2023-10-10
    CentOS
  • 阿里云静态资源服务器地址及其使用方法
    随着互联网的发展,静态资源(如图片、CSS、JavaScript等)在网站中的应用越来越广泛。为了方便用户访问和管理这些资源,阿里云提供了静态资源服务器地址。本文将详细介绍如何使用阿里云静态资源服务器地址,以及如何在网站中引用静态资源。 一...
    99+
    2023-11-05
    阿里 使用方法 静态
  • 如何使用node搭建静态资源管理器
    这篇文章将为大家详细讲解有关如何使用node搭建静态资源管理器,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体如下:我么都知道,老牌的3p服务器都是自带静态资源管理器的...
    99+
    2024-04-02
  • 基于Node实现简易serve静态资源服务器的示例详解
    目录前言基础示例简易 serve 实现arg - 命令行参数读取chalk - 控制台信息输出源码扩展rewrite 和 redirect 的区别?前言 静态资源服务器(HTTP 服...
    99+
    2024-04-02
  • 如何使用Nodejs搭建服务器访问html、css、JS等静态资源文件
    这篇文章给大家分享的是有关如何使用Nodejs搭建服务器访问html、css、JS等静态资源文件的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。第一步,俗话说的好,工欲善其事,必先...
    99+
    2024-04-02
  • Springboot开发OAuth2认证授权与资源服务器操作
    设计并开发一个开放平台。 一、设计: 网关可以 与认证授权服务合在一起,也可以分开。 二、开发与实现: 用Oauth2技术对访问受保护的资源的客户端进行认证与授权。 Oauth2技...
    99+
    2024-04-02
  • 如何使用Node.js搭建一个静态Web服务器
    这篇文章主要介绍了如何使用Node.js搭建一个静态Web服务器的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何使用Node.js搭建一个静态Web服务器文章都会有所收获,下...
    99+
    2024-04-02
  • Windows 环境下nginx 静态资源服务器(图片,文件)权限控制(nginx/openresty/lua)
    Windows 环境下nginx 静态资源服务器(图片,文件)权限控制(nginx/openresty/lua) 前言步骤1.服务器文件目录设置2.openresty下载3 配置nignx权限...
    99+
    2023-09-16
    lua nginx 服务器 运维 后端
  • PHP跨平台开发的生态系统与资源指南
    非常抱歉,由于您没有提供文章标题,我无法为您生成一篇高质量的文章。请您提供文章标题,我将尽快为您生成一篇优质的文章。...
    99+
    2024-05-21
  • 阿里云服务器如何监控资源状态
    1. 简介 阿里云服务器是一种强大的云计算服务,可以为用户提供稳定、可靠、高效的计算资源。然而,由于服务器的复杂性,用户可能无法及时了解服务器的状态和性能。因此,阿里云提供了多种监控工具和服务,帮助用户实时监测服务器资源状态。2. 监控服务...
    99+
    2024-01-21
    阿里 状态 服务器
  • 解开服务器云资源规划的谜团
    关键步骤 确定需求:分析应用程序、工作负载特性和未来增长预测,以确定所需的资源容量和类型。 选择云提供商:考虑价格、性能、可靠性和支持,以选择满足您需求的提供商。 设计架构:创建云架构草图,指定虚拟机、存储、网络和安全配置。 容量规划:...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作