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 ...
随机推荐
- 合合信息AI图像内容安全新技术亮相WAIC2023,防范“生成式造假”
开年以来,多个图像生成软件在全球迅速蹿红,其作画逼真程度"技惊四座".AI一路"狂飙",让生成.篡改等多形式的图片伪造的门槛变得更低,由此引发的隐患也令人忧虑. ...
- Identity – Without Identity Framework
前言 上一回研究 Authenticate 和 Authorization 已经是 2 年前了. 业务需求一直没有增长, 所以也没有再去提升它了. 但最近业务开始上去了. 荒废的功夫又得拾起来了. 上 ...
- EditPlus各个版本的注册码,可用
原文链接:https://www.cnblogs.com/shihaiming/p/6422441.html 工具: editplus注册码生成链接: http://www.jb51.net/tool ...
- 十种SQL的语法
一.ORDER BY FIELD()自定义排序逻辑 ORDER BY FIELD(str,str1,...) 自定义排序sql如下: SELECT * from order_diy ORDER BY ...
- SimpleAIAgent:使用免费的glm-4-flash即可开始构建简单的AI Agent应用
SimpleAIAgent是基于C# Semantic Kernel 与 WPF构建的一款AI Agent探索应用.主要用于使用国产大语言模型或开源大语言模型构建AI Agent应用的探索学习,希望能 ...
- [OI] 指针与迭代器
取地址与解引用 一般来说,我们有一个取地址符 & 可以返回该变量的地址. int main(){ int a; cout<<&a; } 0x6ffe1c 如果我们现在有一个 ...
- 【赵渝强老师】什么是Spark SQL?
一.Spark SQL简介 Spark SQL是Spark用来处理结构化数据的一个模块,它提供了一个编程抽象叫做DataFrame并且作为分布式SQL查询引擎的作用. 为什么要学习Spark SQL? ...
- 【赵渝强老师】如何分析Java的内存溢出问题
一.什么是内存溢出? 内存溢出(OOM:out of memory)通俗理解就是内存不够,通常在运行大型软件或游戏时,软件或游戏所需要的内存远远超出了你主机内安装的内存所承受大小,就叫内存溢出. 在J ...
- softirq和hardirq中断亲和度
/proc/interrupts 和 /proc/softirqs 两者是相互关联的,但它们各自记录的信息和作用有所不同,反映了硬中断和软中断的两个处理阶段. 两者的关系: 硬中断引发软中断: 硬中断 ...
- 前端 面试 html css 如何让一个盒子水平垂直居中?
方法1 使用子绝父相 定位 推荐 说明: 让父元素相对定位,因为要让子元素以父元素为参考对象,如果父元素不设置定位,子元素的参考对象就是整个页面document: 子元素绝对定位,top:50%: ...