1.知识必备

(1)当服务器响应不同文件类型时,需要设置响应报文头,让浏览器选择相应的编码解析数据。

常用对照表HTTP Mime-type:

https://tool.oschina.net/commons

思路:根据访问的路径来提取后缀名,再根据后缀名设置相应的 Content-Type

(2)请求路径不存在时设置返回的状态码

res.statusCode = 404
res.statusMessage = 'Not found'

(3)需要用到path模块和fs模块拼接路径即读取文件

2.模拟Apache服务器(一)

共封装了4个方法;

getFileType(url):根据url获取文件类型

setContentType(res,fileType):根据文件类型设置Mime-type

renderFile(res,url):根据路径读取相应的文件并返回给客户端

troubleShooting(res,url,fileType):错误处理函数

源码:

// 引入http模块
const http = require("http");
//引入fs模块
const fs = require('fs');
//引入path模块 (拼接路径)
const path = require('path'); // 创建一个服务器
var server = http.createServer((req,res)=>{
//获取文件类型
var fileType = getFileType(req.url)
if(!fileType) fileType = "html"
//设置ContentType
setContentType(res,fileType)
//读取文件并返回
renderFile(res,req.url)
}); // 监听接口,需运行此文件,浏览器才能正常访问 "127.0.0.1"
server.listen(80,"127.0.0.1",function(err){
if(err){
throw err;
}
console.log('Server running at http://127.0.0.1:80/');
}); //根据url获取后缀名
function getFileType(url){
//定义文件类型
var fileType = ""
//获取 "." 在url中的下标位置
var index = url.lastIndexOf('.')
if(index>=0){
// xxx.jpg => jpg
fileType = url.substring(index+1)
}
return fileType
} //根据后缀名设置响应头
function setContentType(res,fileType){
var contrast = {
html:"text/html;charset=utf-8",
css:"text/css",
txt:"text/plain;charset=utf-8",
jpg:"image/jpeg",
png:"image/png",
jpeg:"image/jpeg",
svg:"text/xml",
gif:"image/gif",
mp3:"audio/mp3",
mp4:"video/mpeg4",
pdf:"application/pdf"
}
//设置默认的ContentType为text/html;charset=utf-8
var ContentType = "text/html;charset=utf-8"
//如果文件类型为空,则默认设置为html格式
if(!fileType) fileType = "html"
//匹配文件类型
Object.keys(contrast).forEach((key) => {
if(key === fileType){
ContentType = contrast[key]
//跳出遍历
return false
}
})
//设置响应头
res.setHeader("Content-Type",ContentType)
} //封装读取文件的函数 (依赖path和fs模块)
function renderFile(res,url){
//如果访问根目录
if(url=='/'){
url = '/index.html';
}
//设置静态文件根目录
var root = "www"
//拼接路径
var filePath = path.join(__dirname,root,url)
//读取文件
fs.readFile(filePath,function(err,data){
if(err){
//处理异常
troubleShooting(res,url,fileType)
}else{
//返回文件内容
res.end(data)
}
}) } //封装处理错误的函数
function troubleShooting(res,url,fileType){
console.log(url+"文件不存在")
//设置返回的状态码
res.statusCode = 404
res.statusMessage = 'Not found'
//根据文件类型返回不同的数据
if(fileType){
res.end("")
}else{
//返回404页面
res.end("页面不存在")
}
}

3.模拟Apache服务器(二)

(1)文件类型多种多样,每样都要手动设置Mime-Type费时费力,可以使用第三方模块来完成

这个模块就是 mime

安装mime模块

npm i mime

mime的作用就是根据url的后缀,返回对应的Content-Type。

语法:mime.getType(urlStr)

const mime = require("mime")
console.log(mime.getType("xxx.css")) // text/css
console.log(mime.getType("/")) // null

完整代码:

//引入http模块(用于创建http服务)
const http = require('http');
//引入path模块 (用于拼接路径)
const path = require('path');
//引入fs模块 (用于读取文件)
const fs = require('fs');
//引入mime模块(用于设置mime-type)
const mime = require('mime'); //创建http服务对象
var server = http.createServer((req,res)=>{
//根据url获取对应的mime-type
var contentType = mime.getType(req.url);
//设置Content-Type
res.setHeader('Content-Type',contentType);
//根据url读取对应的文件并返回给客户端
returnFile(req.url,res);
}) //根据url返回对应的文件
function returnFile(url,res){
//如果访问根目录就视为访问index.html
if(url=='/'){
url = '/index.html';
}
//设置静态资源目录
var root = "www"
//拼接路径
var targetPath = path.join(__dirname,root,url);
fs.readFile(targetPath,function(err,data){
if(err){
res.end('页面不存在');
}
res.end(data);
})
} //开启服务,监听80端口
server.listen(80,"127.0.0.1",function(err){
if(err){
throw err;
}
console.log('Server running at http://127.0.0.1:80/');
})

4.总结

(1)搭建服务器需要的模块有:

  • http:创建http服务
  • path:拼接路径
  • fs:读取文件
  • mime:设置mime-type

(2)搭建服务器的步骤为:

  • 引入相关模块
  • 创建http服务对象,设置路由,监听用户访问的路径
  • 根据url设置mime-type,保证客户端能正确解析数据
  • 读取要返回的文件并响应给客户端
  • 结束响应

Node.js 模拟Apache服务器的更多相关文章

  1. Node.js 创建HTTP服务器

    Node.js 创建HTTP服务器 如果我们使用PHP来编写后端的代码时,需要Apache 或者 Nginx 的HTTP 服务器,并配上 mod_php5 模块和php-cgi. 从这个角度看,整个& ...

  2. Node.js 创建HTTP服务器(经过测试,这篇文章是靠谱的T_T)

    Node.js 创建HTTP服务器 如果我们使用PHP来编写后端的代码时,需要Apache 或者 Nginx 的HTTP 服务器,并配上 mod_php5 模块和php-cgi. 从这个角度看,整个& ...

  3. node.js模拟qq漂流瓶

    (文章是从我的个人主页上粘贴过来的,大家也可以访问我的主页 www.iwangzheng.com) node.js模拟简易漂流瓶,页面有扔瓶子和捡瓶子的功能,一个瓶子只能被捡到一次,阅读完就置状态位, ...

  4. 使用 Node.js 搭建 Web 服务器

    使用Node.js搭建Web服务器是学习Node.js比较全面的入门教程,因为实现Web服务器需要用到几个比较重要的模块:http模块.文件系统.url解析模块.路径解析模块.以及301重定向技术等, ...

  5. Node.js模拟发起http请求从异步转同步的5种方法

    使用Node.js模拟发起http请求很常用的,但是由于Node模块(原生和第三方库)提供里面的方法都是异步,对于很多场景下应用很麻烦,不如同步来的方便.下面总结了几个常见的库API从异步转同步的几种 ...

  6. node.js 模拟自动发送邮件验证码

    node.js 模拟自动发送邮件验证码 引言 正文 1. QQ邮箱设置 2. 安装nodemailer 3.配置信息 4.综合 5.讲解 结束语 引言 先点赞,再看博客,顺手可以点个关注. 微信公众号 ...

  7. Node.js作web服务器总结

    1.为什么Node.js用JS开发    Node.js 含有一系列内置模块,使得程序可以脱离 Apache HTTP Server 或 IIS,作为独立服务器运行. 首先,我们都清楚的是,同时接收数 ...

  8. Node.js学习笔记(五) --- 使用Node.js搭建Web服务器

    1. Node.js 创建的第一个应用 1.引入http模块 var http = require("http"); 2. 创建服务器接下来我们使用 http.createServ ...

  9. 用 node.js 模仿 Apache 的部分功能

    首先,这个例子用到了服务端渲染的技术.服务端渲染,说白了就是在服务端使用模板引擎,这里我先简单的介绍一下服务端渲染与客户端渲染之间的区别. 服务端渲染与客户端渲染之间的区别: 客户端渲染不利于搜索引擎 ...

  10. node.Js学习-- 创建服务器简要步骤

    1.创建项目目录 mkdir ningha(文件夹名)npm init 初始化项目  获得package.json 2..在node.Js命令行操作进入到文件所在目录 3.输入browser-sync ...

随机推荐

  1. C# – 冷知识 (新手)

    替 Action/Func Parameter 设置名字 public static void MatchBracket(string value, string bracket, Action< ...

  2. C++ STL set/multiset容器

    set/multiset容器 简介 Set的特性是,所有元素都会根据元素的值自动被排序.Set不允许两个元素有相同的值. Set的迭代器iterator是一种const_iterator,不能通过迭代 ...

  3. QT数据可视化框架编程实战之三维散点图从入门到精通_补天云QT技术培训专家

    简介 本文将介绍支持GPU图形硬件加速的QT数据可视化框架编程实战之三维散点图从入门到精通_补天云QT技术培训专家.本文将创建一个含有三个序列的三维散点图,同时设定了坐标轴的标题和标签,使得用户点击表 ...

  4. SQL Server的Descending Indexes降序索引

    SQL Server的Descending Indexes降序索引 背景索引是关系型数据库中优化查询性能的重要手段之一.对于需要处理大量数据的场景,合理的索引策略能够显著减少查询时间. 特别是在涉及多 ...

  5. 暑假集训CSP提高模拟11

    A.Fate 求次短路方案数. 这题有点小水了,好像之前做过. 具体的方案显然是 DP,考虑枚举当前每一个路径长度,假如比最短路更优则覆盖最短路,之前的最短路用来覆盖次短路. 否则如果比次短路更优,则 ...

  6. 《你必须掌握的Entity Framework 6.x与Core 2.0》代码下载

      https://item.jd.com/12376014.html<你必须掌握的Entity Framework 6.x与Core 2.0>代码下载,共享代码: https://git ...

  7. iOS上架App Store使用小结

    1.安装iOS上架辅助软件Appuploader 2.申请iOS发布证书(p12) 3.申请iOS发布描述文件(mobileprovision) 4.打包ipa 5.上传ipa到iTunes Conn ...

  8. .NetCore 目录浏览 和 静态文件

    1.  静态文件 包:microsoft.aspdotnet.staticfiles app.UseStaticFiles()  会默认找到 wwwroot文件夹 // 匹配到指定条件然后执行中间件 ...

  9. Android复习(六)核心组件—>Activity 任何和返回栈、进程和应用生命周期、Parcelable和Bundle

    了解任务和返回堆栈 任务是用户在执行某项工作时与之互动的一系列 Activity 的集合.这些 Activity 按照每个 Activity 打开的顺序排列在一个返回堆栈中.例如,电子邮件应用可能有一 ...

  10. 开发者故事:基于 KubeSphere LuBan 架构打造下一代云交付平台

    前言 在 KubeSphere Marketplace,个人开发者的创意和才能正在逐渐崭露头角.今日,我们荣幸地向大家介绍 Shipper 云交付平台的开发者--凌波,一位云原生领域的资深专家. 凌波 ...