Node.js 模拟Apache服务器
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服务器的更多相关文章
- Node.js 创建HTTP服务器
Node.js 创建HTTP服务器 如果我们使用PHP来编写后端的代码时,需要Apache 或者 Nginx 的HTTP 服务器,并配上 mod_php5 模块和php-cgi. 从这个角度看,整个& ...
- Node.js 创建HTTP服务器(经过测试,这篇文章是靠谱的T_T)
Node.js 创建HTTP服务器 如果我们使用PHP来编写后端的代码时,需要Apache 或者 Nginx 的HTTP 服务器,并配上 mod_php5 模块和php-cgi. 从这个角度看,整个& ...
- node.js模拟qq漂流瓶
(文章是从我的个人主页上粘贴过来的,大家也可以访问我的主页 www.iwangzheng.com) node.js模拟简易漂流瓶,页面有扔瓶子和捡瓶子的功能,一个瓶子只能被捡到一次,阅读完就置状态位, ...
- 使用 Node.js 搭建 Web 服务器
使用Node.js搭建Web服务器是学习Node.js比较全面的入门教程,因为实现Web服务器需要用到几个比较重要的模块:http模块.文件系统.url解析模块.路径解析模块.以及301重定向技术等, ...
- Node.js模拟发起http请求从异步转同步的5种方法
使用Node.js模拟发起http请求很常用的,但是由于Node模块(原生和第三方库)提供里面的方法都是异步,对于很多场景下应用很麻烦,不如同步来的方便.下面总结了几个常见的库API从异步转同步的几种 ...
- node.js 模拟自动发送邮件验证码
node.js 模拟自动发送邮件验证码 引言 正文 1. QQ邮箱设置 2. 安装nodemailer 3.配置信息 4.综合 5.讲解 结束语 引言 先点赞,再看博客,顺手可以点个关注. 微信公众号 ...
- Node.js作web服务器总结
1.为什么Node.js用JS开发 Node.js 含有一系列内置模块,使得程序可以脱离 Apache HTTP Server 或 IIS,作为独立服务器运行. 首先,我们都清楚的是,同时接收数 ...
- Node.js学习笔记(五) --- 使用Node.js搭建Web服务器
1. Node.js 创建的第一个应用 1.引入http模块 var http = require("http"); 2. 创建服务器接下来我们使用 http.createServ ...
- 用 node.js 模仿 Apache 的部分功能
首先,这个例子用到了服务端渲染的技术.服务端渲染,说白了就是在服务端使用模板引擎,这里我先简单的介绍一下服务端渲染与客户端渲染之间的区别. 服务端渲染与客户端渲染之间的区别: 客户端渲染不利于搜索引擎 ...
- node.Js学习-- 创建服务器简要步骤
1.创建项目目录 mkdir ningha(文件夹名)npm init 初始化项目 获得package.json 2..在node.Js命令行操作进入到文件所在目录 3.输入browser-sync ...
随机推荐
- C# – 冷知识 (新手)
替 Action/Func Parameter 设置名字 public static void MatchBracket(string value, string bracket, Action< ...
- C++ STL set/multiset容器
set/multiset容器 简介 Set的特性是,所有元素都会根据元素的值自动被排序.Set不允许两个元素有相同的值. Set的迭代器iterator是一种const_iterator,不能通过迭代 ...
- QT数据可视化框架编程实战之三维散点图从入门到精通_补天云QT技术培训专家
简介 本文将介绍支持GPU图形硬件加速的QT数据可视化框架编程实战之三维散点图从入门到精通_补天云QT技术培训专家.本文将创建一个含有三个序列的三维散点图,同时设定了坐标轴的标题和标签,使得用户点击表 ...
- SQL Server的Descending Indexes降序索引
SQL Server的Descending Indexes降序索引 背景索引是关系型数据库中优化查询性能的重要手段之一.对于需要处理大量数据的场景,合理的索引策略能够显著减少查询时间. 特别是在涉及多 ...
- 暑假集训CSP提高模拟11
A.Fate 求次短路方案数. 这题有点小水了,好像之前做过. 具体的方案显然是 DP,考虑枚举当前每一个路径长度,假如比最短路更优则覆盖最短路,之前的最短路用来覆盖次短路. 否则如果比次短路更优,则 ...
- 《你必须掌握的Entity Framework 6.x与Core 2.0》代码下载
https://item.jd.com/12376014.html<你必须掌握的Entity Framework 6.x与Core 2.0>代码下载,共享代码: https://git ...
- iOS上架App Store使用小结
1.安装iOS上架辅助软件Appuploader 2.申请iOS发布证书(p12) 3.申请iOS发布描述文件(mobileprovision) 4.打包ipa 5.上传ipa到iTunes Conn ...
- .NetCore 目录浏览 和 静态文件
1. 静态文件 包:microsoft.aspdotnet.staticfiles app.UseStaticFiles() 会默认找到 wwwroot文件夹 // 匹配到指定条件然后执行中间件 ...
- Android复习(六)核心组件—>Activity 任何和返回栈、进程和应用生命周期、Parcelable和Bundle
了解任务和返回堆栈 任务是用户在执行某项工作时与之互动的一系列 Activity 的集合.这些 Activity 按照每个 Activity 打开的顺序排列在一个返回堆栈中.例如,电子邮件应用可能有一 ...
- 开发者故事:基于 KubeSphere LuBan 架构打造下一代云交付平台
前言 在 KubeSphere Marketplace,个人开发者的创意和才能正在逐渐崭露头角.今日,我们荣幸地向大家介绍 Shipper 云交付平台的开发者--凌波,一位云原生领域的资深专家. 凌波 ...