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



相关文章
|
21天前
|
机器学习/深度学习 JavaScript Cloud Native
Node.js作为一种快速、可扩展的服务器端运行时环境
Node.js作为一种快速、可扩展的服务器端运行时环境
33 8
|
25天前
|
JavaScript
使用Node.js创建一个简单的Web服务器
使用Node.js创建一个简单的Web服务器
|
28天前
|
机器学习/深度学习 人工智能 JavaScript
JavaScript和TypeScript的未来发展趋势及其在Web开发中的应用前景
本文探讨了JavaScript和TypeScript的未来发展趋势及其在Web开发中的应用前景。JavaScript将注重性能优化、跨平台开发、AI融合及WebAssembly整合;TypeScript则强调与框架整合、强类型检查、前端工程化及WebAssembly的深度结合。两者结合发展,特别是在Vue 3.0中完全采用TypeScript编写,预示着未来的Web开发将更加高效、可靠。
42 4
|
28天前
|
开发框架 JavaScript 前端开发
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势。通过明确的类型定义,TypeScript 能够在编码阶段发现潜在错误,提高代码质量;支持组件的清晰定义与复用,增强代码的可维护性;与 React、Vue 等框架结合,提供更佳的开发体验;适用于大型项目,优化代码结构和性能。随着 Web 技术的发展,TypeScript 的应用前景广阔,将继续引领 Web 开发的新趋势。
36 2
|
1月前
|
XML 前端开发 JavaScript
PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑
本文深入探讨了PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑;Ajax则通过异步请求实现页面无刷新更新。文中详细介绍了两者的工作原理、数据传输格式选择、具体实现方法及实际应用案例,如实时数据更新、表单验证与提交、动态加载内容等。同时,针对跨域问题、数据安全与性能优化提出了建议。总结指出,PHP与Ajax的结合能显著提升Web应用的效率和用户体验。
46 3
|
1月前
|
JavaScript
使用node.js搭建一个express后端服务器
Express 是 Node.js 的一个库,用于搭建后端服务器。本文将指导你从零开始构建一个简易的 Express 服务器,包括项目初始化、代码编写、服务启动与项目结构优化。通过创建 handler 和 router 文件夹分离路由和处理逻辑,使项目更清晰易维护。最后,通过 Postman 测试确保服务正常运行。
49 1
|
1月前
|
数据采集 JavaScript 搜索推荐
服务器端渲染(SSR)(Nuxt+Next.js)
服务器端渲染(SSR)技术在服务器上生成页面HTML,提升首屏加载速度和SEO效果。Nuxt.js和Next.js分别是基于Vue.js和React.js的流行SSR框架。Nuxt.js提供自动化路由管理、页面级数据获取和布局系统,支持SSR和静态站点生成。Next.js支持SSR、静态生成和文件系统路由,通过`getServerSideProps`和`getStaticProps`实现数据获取。SSR的优点包括首屏加载快、SEO友好和适合复杂页面,但也会增加服务器压力、开发限制和调试难度。选择框架时,可根据项目需求和技术栈决定使用Nuxt.js或Next.js。
|
1月前
|
缓存 负载均衡 监控
性能优化:Node.js高效服务器开发技巧与最佳实践
【10月更文挑战第29天】在Node.js服务器开发中,性能优化至关重要。本文介绍了几种高效开发的最佳实践,包括使用缓存策略、采用异步编程、实施负载均衡和性能监控。通过示例代码展示了如何实现这些技术,帮助开发者构建更快、更稳定的Node.js应用。
77 2
|
1月前
|
JavaScript 前端开发 持续交付
构建现代Web应用:Vue.js与Node.js的完美结合
【10月更文挑战第22天】随着互联网技术的快速发展,Web应用已经成为了人们日常生活和工作的重要组成部分。前端技术和后端技术的不断创新,为Web应用的构建提供了更多可能。在本篇文章中,我们将探讨Vue.js和Node.js这两大热门技术如何完美结合,构建现代Web应用。
38 4
|
2月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
165 3