我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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静态资源服务器的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

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

下载Word文档

猜你喜欢

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

这篇文章主要为大家介绍了Node.js开发静态资源服务器示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2022-11-13

网页开发中静态资源与动态资源的区别

静态资源和动态资源的区别:1、内容变化的区别;2、处理方式的区别;3、应用场景的区别;静态资源通常是预先创建好的,其内容在服务器启动后就已经确定,不会因为用户的请求而改变。动态资源的内容则是在接收到用户请求后,由服务器根据请求的参数动态生成的。
网页开发中静态资源与动态资源的区别
2023-10-29

nodejs搭建静态资源服务器

随着互联网的发展,Web开发在全球范围内已经成为了一项非常热门的行业,对于开发人员来说,为了能够快速有效地开发并发布代码,需要有一个静态资源服务器来帮助我们管理和处理静态资源,特别是在前后端分离的开发模式中使用频率较高,而Node.js发布以来已成为非常热门的一种开发语言,其自身所带的http模块特别适合用于搭建静态资源服务器。在这篇文章中,将会介绍如何使用Node.js来搭建
2023-05-14

使用Node.js搭建静态资源服务详细教程

对于Node.js新手,搭建一个静态资源服务器是个不错的锻炼,从最简单的返回文件或错误开始,渐进增强,还可以逐步加深对http的理解。那就开始吧,让我们的双手沾满网络请求! Note: 当然在项目中如果有使用express框架,用expre
2022-06-04

阿里云静态资源服务器怎么用的啊

简介阿里云静态资源服务器是一种用于存储和分发静态资源的解决方案,可以帮助开发人员更高效地管理和发布网站内容。本文将介绍如何使用阿里云静态资源服务器,并提供一些实际应用的例子。使用步骤步骤一:创建静态资源服务器实例在阿里云控制台上,选择合适的地域和可用区,然后创建一个静态资源服务器实例。在创建实例时,可以选择实例规格、存
阿里云静态资源服务器怎么用的啊
2024-01-18

阿里云静态资源服务器地址是什么?

随着互联网技术的发展,网站和应用程序的开发已经成为了许多企业和个人的日常。在这个过程中,静态资源的处理和存储是一个非常重要的环节。阿里云作为国内领先的云计算服务提供商,提供了一系列的静态资源服务器服务,可以帮助企业和个人轻松地管理和存储静态资源。那么,阿里云静态资源服务器地址是什么呢?本文将对这个问题进行详细解答
阿里云静态资源服务器地址是什么?
2023-11-12

如何使用PHP开发缓存优化静态资源加载

如何使用PHP开发缓存优化静态资源加载简介:在网页开发中,静态资源如图片、CSS样式表和JavaScript脚本文件等往往会占据大部分的加载时间。对于大型网站或者高并发访问的网站来说,如何优化静态资源的加载速度是一个重要的问题。本文将介绍如
如何使用PHP开发缓存优化静态资源加载
2023-11-07

CentOS搭建web服务器的动态缓存与静态资源优化

在CentOS上搭建Web服务器时,可以采取以下措施来进行动态缓存和静态资源优化:1. 使用缓存插件:安装和配置缓存插件,如Varnish或Nginx的反向代理缓存,可以将动态内容缓存起来,减少对后端服务器的请求压力。这些插件可以将频繁请求
2023-10-10

Nginx在Docker中的静态资源服务配置与优化(如何在Docker中为Nginx配置高效的静态资源服务?)

在Docker环境中配置Nginx提供高效的静态资源服务涉及创建Dockerfile、构建镜像和运行容器。Nginx配置(nginx.conf)指定静态文件位置和处理规则。优化技巧包括启用gzip压缩、设置缓存头和使用CDN。监控和故障排除对于确保服务正常运行至关重要,可以利用Nginx日志、监控工具和测试工具。通过遵循这些步骤和技巧,可以在Docker中为Nginx配置高效的静态资源服务。
Nginx在Docker中的静态资源服务配置与优化(如何在Docker中为Nginx配置高效的静态资源服务?)
2024-04-02

阿里云静态资源服务器地址及其使用方法

随着互联网的发展,静态资源(如图片、CSS、JavaScript等)在网站中的应用越来越广泛。为了方便用户访问和管理这些资源,阿里云提供了静态资源服务器地址。本文将详细介绍如何使用阿里云静态资源服务器地址,以及如何在网站中引用静态资源。一、阿里云静态资源服务器地址的使用阿里云静态资源服务器地址是阿里云提供的一种静
阿里云静态资源服务器地址及其使用方法
2023-11-05

Node.js静态文件服务器改进版

首先还是先感谢github,感谢github上提供此段源码的作者。跟昨晚的来比今天的静态文件服务器有点点复杂些,可以学到很多新的东西。仔细会发现这次的代码多了一个fs.stat函数和ReadStream对象的pipe函数,stat这个函数是
2022-06-04

用Nodejs搭建服务器访问html、css、JS等静态资源文件

为了测一个附近门店的功能,需要配置一下服务器进行测试。本来打算用apache的,后来想自己是做前端的,好久没有用过Nodejs了何不用所学的知识自己配一下呢,说动手就手。 第一步,俗话说的好,工欲善其事,必先利其器。既然要用node+exp
2022-06-04

linux服务器上使用nginx访问本地静态资源的方法

1.查看80端口是否被占用,一般80端口多被apache服务占用。 netstat -anp|grep 80 2.修改apache服务的端口号 vim /etc/apache2/ports.conf3.将
2022-06-04

编程热搜

目录