建简单的静态文件服务器:使用Node.js和HTTP模块

创建简单的静态文件服务器:使用Node.js和HTTP模块

在Web开发中,经常需要搭建一个能够提供静态文件访问的服务器。无论是用于本地开发调试,还是用于部署网站,这都是一个常见的需求。本篇文章将介绍如何使用Node.js和其内置的HTTP模块来创建一个简单的静态文件服务器。

准备工作

首先,确保你已经安装了Node.js环境。如果没有安装,可以到Node.js官网(nodejs.org/)下载并安装最新版本。

代码实现

接下来,我们将通过以下代码来创建一个简单的静态文件服务器:

javascript

复制代码

const http = require('http'); const fs = require('fs'); const path = require('path'); const server = http.createServer((req, res) => { // 省略上面提到的代码,详见下文 }); const port = process.env.PORT || '3030'; server.listen(port, () => { console.log(`Server running at http://localhost:${port}/`); });

代码解释:我们首先导入了Node.js内置的httpfspath模块,分别用于创建HTTP服务器、读取文件和处理文件路径。然后使用http.createServer方法创建了一个HTTP服务器,并传入了一个回调函数处理请求和响应。接着定义了服务器监听的端口号,并通过server.listen方法来启动服务器。

接下来,我们需要完善回调函数中的逻辑,使其能够根据请求的路径返回相应的静态文件内容。以下是完整的代码:

javascript

复制代码

// 上面提到的回调函数 const server = http.createServer((req, res) => { let filePath = '.' + req.url; if (filePath === './') { filePath = './index.html'; } // 省略文件类型判断和读取文件的部分,详见下文 }); // 省略端口设置和服务器启动的部分

在上面的代码中,我们根据请求的URL构造了文件路径filePath,并设置了默认的文件路径为'./index.html'。接下来,我们需要根据文件的扩展名来确定其Content-Type,并读取文件内容,然后将文件内容作为响应返回给客户端。具体的文件类型判断和读取文件的部分如下:

javascript

复制代码

// 文件类型判断和读取文件的部分 const extname = String(path.extname(filePath)).toLowerCase(); const contentType = { '.html': 'text/html', '.js': 'text/javascript', // ... 其他文件类型的Content-Type }[extname] || 'application/octet-stream'; fs.readFile(filePath, function (error, content) { if (error) { if (error.code === 'ENOENT') { // 文件不存在 fs.readFile('./404.html', function (error, content) { res.writeHead(404, {'Content-Type': 'text/html'}); res.end(content, 'utf-8'); }); } else { // 其他错误 res.writeHead(500); res.end('Sorry, check with the site admin for error: ' + error.code + ' ..\n'); res.end(); } } else { // 文件存在 res.writeHead(200, {'Content-Type': contentType}); res.end(content, 'utf-8'); } });

在上面的代码中,我们首先通过path.extname方法获取文件的扩展名,然后根据扩展名确定其Content-Type,并使用fs.readFile方法读取文件内容。如果读取文件出现错误,我们会返回相应的状态码和错误信息;如果文件存在,则根据Content-Type设置响应头,并将文件内容返回给客户端。

运行服务器

保存以上代码到一个文件(比如server.js),然后打开命令行,进入文件所在目录,运行以下命令启动服务器:

bash

复制代码

node server.js

此时,服务器会在默认端口3030上启动,你可以打开浏览器访问http://localhost:3030/来查看效果。如果需要修改端口,可以通过设置环境变量PORT来改变监听的端口号,比如:

bash

复制代码

PORT=8080 node server.js

总结

通过本篇文章,我们学习了如何使用Node.js和HTTP模块来创建一个简单的静态文件服务器。这个服务器可以用于提供HTML、CSS、JavaScript等静态文件,在开发调试和部署网站时非常有用。希望这篇文章能够帮助你更好地理解Node.js的HTTP模块以及静态文件服务器的实现原理。

完整代码

javascript

复制代码

const http = require('http'); // 导入内置的 http 模块 const fs = require('fs'); // 导入内置的文件系统模块 const path = require('path'); // 导入内置的路径处理模块 const server = http.createServer((req, res) => { let filePath = '.' + req.url; // 构造文件路径,以当前目录为根目录 if (filePath === './') { // 如果文件路径为根路径 filePath = './index.html'; // 默认返回 index.html 文件 } const extname = String(path.extname(filePath)).toLowerCase(); // 获取文件的扩展名并转换为小写 const contentType = { // 定义不同文件类型对应的 Content-Type '.html': 'text/html', '.js': 'text/javascript', '.css': 'text/css', '.json': 'application/json', '.png': 'image/png', '.jpg': 'image/jpg', '.gif': 'image/gif', '.svg': 'image/svg+xml', '.wav': 'audio/wav', '.mp4': 'video/mp4', '.woff': 'application/font-woff', '.ttf': 'application/font-ttf', '.eot': 'application/vnd.ms-fontobject', '.otf': 'application/font-otf', '.wasm': 'application/wasm' }[extname] || 'application/octet-stream'; // 如果找不到对应的 Content-Type,默认使用 application/octet-stream fs.readFile(filePath, function (error, content) { // 读取文件内容的回调函数 if (error) { // 如果读取文件出现错误 if (error.code === 'ENOENT') { // 如果文件不存在 fs.readFile('./404.html', function (error, content) { // 读取 404.html 文件 res.writeHead(404, {'Content-Type': 'text/html'}); // 返回状态码和 Content-Type res.end(content, 'utf-8'); // 返回文件内容 }); } else { // 其他错误 res.writeHead(500); // 返回状态码 500 res.end('Sorry, check with the site admin for error: ' + error.code + ' ..\n'); // 返回错误信息 res.end(); // 结束响应 } } else { // 如果文件存在 res.writeHead(200, {'Content-Type': contentType}); // 返回状态码和对应的 Content-Type res.end(content, 'utf-8'); // 返回文件内容 } }); }); const port = process.env.PORT || '3030'; // 设置服务器监听的端口号,默认为 3030 server.listen(port, () => { console.log(`Server running at http://localhost:${port}/`); // 在控制台输出服务器启动信息 });

注意

运行server.js文件,需要把文件放的build目录里面。如果想要放到build目录外面则要更改 这里build的目录设置

js

复制代码

let filePath = './build' + req.url; if (filePath === './build/') { filePath = './build/index.html'; }

本文转自 https://juejin.cn/post/7300287280745005066,如有侵权,请联系删除。

本文由mdnice多平台发布

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,591评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,448评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,823评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,204评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,228评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,190评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,078评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,923评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,334评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,550评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,727评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,428评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,022评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,672评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,826评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,734评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,619评论 2 354

推荐阅读更多精彩内容