Node.js 创建并封装静态 WEB 服务器

简介: Node.js 创建并封装静态 WEB 服务器

准备工作:

准备好一个类似图片中这样的材料

传送门:本文所需材料及完整代码

2020062310470442.png

1. 详细步骤

创建 http 服务

// app.js
const http = require('http');  // 加载http服务模块
http.createServer((req, res) => {
  res.writeHead(200, {'Content-Type': 'text/html;charset=utf-8'});
  res.end();   // 结束响应
}).listen(3000);  // 设置端口号
console.log('Server running at http://127.0.0.1:3000/');

获取 URL

// 我们要获取类似这样的url,来展示对应的内容
http://localhost:3000/index.html
let pathName = req.url;
console.log(pathName);  // /index.html   /favicon.ico

我们发现发送了两次请求,而 /favicon.ico 这个请求,需要过滤掉。同时,我们需要对空地址做处理,代码如下:

// app.js
const http = require('http');  // 加载http服务模块
http.createServer(function (req, res) {
  let pathName = req.url;
  pathName = pathName == '/' ? '/index.html' : pathName;
  if(pathName != '/favicon.ico'){
     res.writeHead(200, {'Content-Type': 'text/html;charset=utf-8'});
     res.end();
  }
}).listen(3000);
console.log('Server running at http://127.0.0.1:3000/');

读取文件

首先加载 fs 模块,如果请求的页面没有找到,则加载404页面

// app.js
const http = require('http');  // 加载http服务模块
const fs = require('fs');
http.createServer(function (req, res) {
  // http://127.0.0.1:3000/login.html
  // 1. 获取地址
  let pathName = req.url;
  pathName = pathName == '/' ? '/index.html' : pathName;
  // 2. 通过fs模块读取文件
  if(pathName != '/favicon.ico'){
    fs.readFile(`./static${pathName}`,(err,data) => {
      if(err){
        fs.readFile('./static/404.html',(err,data404)=>{
          if(err){
            console.log('404')
          }else{
            res.writeHead(404, {'Content-Type': 'text/html;charset=utf-8'});
            res.end(data404);
          }
        })
      }else{
        res.writeHead(200, {'Content-Type': 'text/html;charset=utf-8'});
        res.end(data);
      }
    })
  }
}).listen(3000);
console.log('Server running at http://127.0.0.1:3000/');

此时,我们已经可以看到效果如下:

2020062310470442.png

设置请求头

因为我们将所有请求的文件表头都设置为 ‘Content-Type’: ‘text/html;charset=utf-8’;

这显然是错误的做法。比如:css 文件 应设置为 ‘text/css’ , js文件 设置为 ‘text/javascript’ 。


我们先创建一个文件夹,将它命名为 module,在该文件夹下创建一个 js 文件 common.js

代码如下:

// common.js
const fs = require('fs');
exports.getFileMime = (extName) => {
  // readFileSync 为 readFile 的同步方法
  let data = fs.readFileSync('./data/mime.json'); // 注意:因为该方法在 app.js 引用,所以相对位置应以app.js为基点
  let mimeObj = JSON.parse(data.toString());
  return mimeObj[extName]
}

我们要根据对应的请求的文件后缀名来设置对应的文件格式,因此要引入 path 模块。再用 path.extname() 方法,获取到对应的后缀名。

// app.js
const http = require('http');  // 加载http服务模块
const fs = require('fs');
const path = require('path');
const common = require('./moudle/common');
http.createServer(function (req, res) {
  // http://127.0.0.1:3000/login.html
  // 1. 获取地址
  let pathName = req.url;
  pathName = pathName == '/' ? '/index.html' : pathName;
  // 获取后缀名 path.extname();
  let extname = path.extname(pathName)
  console.log(pathName)
  // 2. 通过fs模块读取文件
  if(pathName != '/favicon.ico'){
    fs.readFile(`./static${pathName}`,(err,data) => {
      if(err){
        fs.readFile('./static/404.html',(err,data404)=>{
          if(err){
            console.log('404')
          }else{
            res.writeHead(404, {'Content-Type': 'text/html;charset="utf-8"'});
            res.end(data404);
          }
        })
      }else{
        let mime = common.getFileMime(extname) // 根据对应的后缀名,获取对应的文件格式
        res.writeHead(200, {'Content-Type': `${mime};charset="utf-8"`});
        res.end(data);
      }
    })
  }
}).listen(3000);
console.log('Server running at http://127.0.0.1:3000/');

结果如图所示:

2020062310470442.png

但是,对应的图片并未加载进来。这是因为:这两个文件未加载,原因是请求地址后带参数,无法识别,所以需要再引入 url 模块,使用 url.parse() 方法,将该地址解析为不带参数的地址;

2020062310470442.png

完整代码:

// app.js
const http = require('http');  // 加载http服务模块
const fs = require('fs');
const path = require('path');
const url = require('url');
const common = require('./moudle/common');
http.createServer(function (req, res) {
  // http://127.0.0.1:3000/login.html
  // 1. 获取地址
  let pathName = url.parse(req.url).pathname;
  pathName = pathName == '/' ? '/index.html' : pathName;
  // 获取后缀名 path.extname();
  let extname = path.extname(pathName)
  // 2. 通过fs模块读取文件
  if(pathName != '/favicon.ico'){
    fs.readFile(`./static${pathName}`,(err,data) => {
      if(err){
        fs.readFile('./static/404.html',(err,data404)=>{
          if(err){
            console.log('404')
          }else{
            res.writeHead(404, {'Content-Type': 'text/html;charset="utf-8"'});
            res.end(data404);
          }
        })
      }else{
        let mime = common.getFileMime(extname) // 根据对应的后缀名,获取对应的文件格式
        res.writeHead(200, {'Content-Type': `${mime};charset="utf-8"`});
        res.end(data);
      }
    })
  }
}).listen(3000);
console.log('Server running at http://127.0.0.1:3000/');

结果如图:

2020062310470442.png

2. 封装静态 WEB 服务器

2020062310470442.png

如上图所示,在 NODEJS 目录下新建 staticApp.js 在 moudle目录下新建 route.js,用于封装静态 web 服务器。

//  route.js
const fs = require('fs');
const path = require('path');
const url = require('url');
// 私有方法
function getFileMime(extName){
  // readFileSync 为 readFile 的同步方法
  let data = fs.readFileSync('./data/mime.json'); // 注意:因为该方法在 app.js 引用,所以相对位置应以app.js为基点
  let mimeObj = JSON.parse(data.toString());
  return mimeObj[extName]
}
exports.static = (req,res,staticPath) => {
  // 1. 获取地址
  let pathName = url.parse(req.url).pathname;
  pathName = pathName == '/' ? '/index.html' : pathName;
  // 获取后缀名 path.extname();
  let extname = path.extname(pathName)
  // 2. 通过fs模块读取文件
  if(pathName != '/favicon.ico'){
    fs.readFile(`./${staticPath}${pathName}`,(err,data) => {
      if(err){
        fs.readFile('./static/404.html',(err,data404)=>{
          if(err){
            console.log('404')
          }else{
            res.writeHead(404, {'Content-Type': 'text/html;charset="utf-8"'});
            res.end(data404);
          }
        })
      }else{
        let mime = getFileMime(extname) // 根据对应的后缀名,获取对应的文件格式
        res.writeHead(200, {'Content-Type': `${mime};charset="utf-8"`});
        res.end(data);
      }
    })
  }
}
// staticApp.js
const http = require('http');  // 加载http服务模块
const routes = require('./moudle/routes')
http.createServer(function (req, res) {
  routes.static(req,res,'static')
}).listen(8000);
console.log('Server running at http://127.0.0.1:8000/');

结果如图:

2020062310470442.png



相关文章
|
2月前
|
前端开发 JavaScript 开发者
JavaScript:无处不在的Web语言
JavaScript:无处不在的Web语言
|
2月前
|
前端开发 JavaScript 开发者
JavaScript:构建动态Web的核心力量
JavaScript:构建动态Web的核心力量
|
2月前
|
JavaScript 前端开发 开发者
JavaScript:驱动现代Web的核心引擎
JavaScript:驱动现代Web的核心引擎
|
6月前
|
前端开发 算法 API
构建高性能图像处理Web应用:Next.js与TailwindCSS实践
本文分享了构建在线图像黑白转换工具的技术实践,涵盖技术栈选择、架构设计与性能优化。项目采用Next.js提供优秀的SSR性能和SEO支持,TailwindCSS加速UI开发,WebAssembly实现高性能图像处理算法。通过渐进式处理、WebWorker隔离及内存管理等策略,解决大图像处理性能瓶颈,并确保跨浏览器兼容性和移动设备优化。实际应用案例展示了其即时处理、高质量输出和客户端隐私保护等特点。未来计划引入WebGPU加速、AI增强等功能,进一步提升用户体验。此技术栈为Web图像处理应用提供了高效可行的解决方案。
|
2月前
|
JavaScript 前端开发 物联网
JavaScript:驱动现代Web的核心引擎
JavaScript:驱动现代Web的核心引擎
|
5月前
|
JSON JavaScript 前端开发
JavaScript入门干货:蓝桥杯Web组分章学习笔记(基于蓝桥云课《JavaScript基础入门》)
这是一份详尽的JavaScript学习笔记,涵盖基础到进阶内容。包括变量、运算符、数组、字符串操作,DOM/BOM事件处理,内置对象(如Array、Date、Math)用法,JSON格式解析,以及函数作用域与闭包等核心概念。同时深入探讨值类型和引用类型的差异、异常处理机制,并介绍函数高级特性如call/apply/bind方法、递归及arguments对象。代码按章节分点整理,注释细致,适合初学者系统掌握JavaScript编程知识。
116 2
|
9月前
|
弹性计算 JavaScript 前端开发
一键安装!阿里云新功能部署Nodejs环境到ECS竟然如此简单!
Node.js 是一种高效的 JavaScript 运行环境,基于 Chrome V8 引擎,支持在服务器端运行 JavaScript 代码。本文介绍如何在阿里云上一键部署 Node.js 环境,无需繁琐配置,轻松上手。前提条件包括 ECS 实例运行中且操作系统为 CentOS、Ubuntu 等。功能特点为一键安装和稳定性好,支持常用 LTS 版本。安装步骤简单:登录阿里云控制台,选择扩展程序管理页面,安装 Node.js 扩展,选择实例和版本,等待创建完成并验证安装成功。通过阿里云的公共扩展,初学者和经验丰富的开发者都能快速进入开发状态,开启高效开发之旅。
|
9月前
|
弹性计算 JavaScript 前端开发
一键安装!阿里云新功能部署Nodejs环境到ECS竟然如此简单!
一键安装!阿里云新功能部署Nodejs环境到ECS竟然如此简单!
一键安装!阿里云新功能部署Nodejs环境到ECS竟然如此简单!
|
11月前
|
机器学习/深度学习 JavaScript Cloud Native
Node.js作为一种快速、可扩展的服务器端运行时环境
Node.js作为一种快速、可扩展的服务器端运行时环境
202 8

热门文章

最新文章