浏览器是JavaScript的前端运行坏境
node.js是JavaScript的后端运行环境
node.js中无法调用DOM和BOM等浏览器内置API
fs文件系统模块
fs模块是node.js官方提供的,用来操作文件的模块。提供了一系列的方法和属性,用来满足用于对文件的操作需求
fs.readFile()方法,用来读取指定文件中的内容
fs.writeFile()方法,用来向指定的文件中写入内容
如果要在Javascript代码中,使用fs模块来操作文件,则需要使用如下的方式先导入它:
const fs=require("fs")//fs模块化
读取指定文件中的内容
fs.readFile(path[,options],callback)
path 必选参数,字符串,表示文件的路径
options 可选参数,表示以什么编码格式来读取文件
callback 必选参数,文件读取完成以后,通过回调函数拿到读取的结果
//导入fs模块
const fs=require("fs");
//调用fs.readFile()方法读取文件
//参数1:读取文件的存放路径
//参数2:读取文件时候采用的编码格式,一般默认指定 utf8
//参数3:回调函数,拿到读取失效和成功的结果 err和dataStr
fs.readFile("./file.txt","utf8",function(err,dataStr){
//打印失败的结果
//如果读取成功,err的值为null
//如果读取失败,err的值为 错误对象,dataStr的值为undefined
console.log(err);
//打印成功的结果
console.log(dataStr);
})
判断文件是否读取成功
可以判断err对象是否为null,从而知晓文件读取的结果:
const fs=require("fs");
fs.readFile("./file.txt","utf8",function(err,dataStr){
if(err){
return console.log("读取文件失败"+err.massage);
}
console.log('读取文件成功'+dataStr);
})
向指定的文件中写入内容
注意:
①fs.writeFile()方法只能用来创建文件夹,不能用来创建路径
②重复调用fs.writeFile()写入同一个文件,新写的内容会覆盖之前的旧内容
fs.writeFile(file,data[,options],callback)
file 必选参数,需要指定一个文件路径的字符串,表示文件的存放路径
data 必选参数,表示要写入的内容
options 可选参数,表示以什么格式写入文件内容,默认值是utf8
Callback 必选参数,文件写入完成后的回调函数
向指定的文件路径中,写入文件内容
//导入fs模块
const fs=require("fs");
//写入文件的内容
fs.writeFile('./1.txt','abc','utf8',function(err,dataStr){
//参数1:表示文件的存放路径
//参数2:表示写入的内容
//参数3:回调函数
//如果文件写入成功,则 err的值等于null
//如果文件写入失败,则 err的值等于一个 错误对象
console.log(err);
})
判断文件是否写入成功
可以判读err对象是否为null,从而知晓文件写入的结果
//导入fs模块,来操作文件
const fs=require("fs");
fs.writeFile("./1.txt",'abc',function(err){
if(err){
return console.log("文件写入失败!"+err.message);
}
console.log("文件写入成功");
})
fs模块-路径动态拼接的问题
在使用fs模块操作文件时,如果提供的操作路径是以 ./ 或 ../开头的相对路径时,很容易出现路径动态拼接错误的问题
原因:代码在运行的时候,会以执行node命令时所处的目录,动态拼接出被操作文件的完整路径
解决方案: 在使用fs模块操作文件时,直接提供完整的路径,不需要提供 ./ 或 ../开头的相对路径,从而防止路径动态拼接的问题
//dirname表示当前文件所处的目录 fs.readFile(__dirname+"/files/1.txt","uft8",function(err,dataStr){ if(err){ return console.log("读取文件失败"+err.massage); } console.log("读取文件成功") })
__dirname 表示当前文件所处的目录
path 路径模块
path路径模块是Node.js官方提供的,用来处理路径的模块,它提供了一系列的方法和属性,用来满足用户对路径的处理需求
path.join()方法,用来将多个路径片段拼接成一个完整的路径字符串
path.basename()方法,用来从路径字符串中,将文件名解析出来
如果要在javascript代码中,使用path模块来处理路径,则需要使用如下的方式先导入它:
//导入path模块
const path=require("path");
path.join()的语法格式
使用path.join()方法,可以把多个路径片段拼接为完整的路径字符串,语法格式如下
path.join([...paths])
参数:...paths<string>路径片段的序列
返回值:<string>
//导入path模块
const path=require("path");
//注意 ../ 会抵消前面的路径
const pathStr=path.join('a','/b/c','../','./d','e');
console.log(pathStr);//输出\a\b\d\e
注意:今后凡是涉及到路径拼接的操作,都要使用path.join()方法进行处理,不要直接使用+进行字符串的拼接
//导入path模块
const path=require("path");
fs.readFile(path.join(__dirname,"file/1.txt"),"utf8",function(err,dataStr){
if(err){
return console.log(err.message);
}
console.log(dataStr);
})
获取路径中的文件名
path.basename()的语法格式
使用path.basename()方法,可以获取路径中的最后一部分,经常通过这个方法获取路径中的文件名,语法格式如下:
path.basename(path,[,ext])
path<string> 必选参数,表示一个路径的字符串
ext<string> 可选参数,表示文件的扩展名
返回<string>表示路径中的最后一部分
使用path.basename()方法,可以从一个文件路径中,获取到文件的名称部分
const path=require("path"); //定义文件的存放路径 const fpath='/a/b/c/index.html'; const fullName=path.basename(fpath); console.log(fullName);//index.html const fullName=path.basename(fpath,'.html'); console.log(fullName);//index
获取路径中的文件扩展名
path.extname() 的语法格式
使用path.extname()方法,可以获取路径中的扩展名部分,语法格式如下:
path.extname(path)
path<string> 必须参数,表示一个路径的字符串
返回值:<string>返回得到的扩展名字符串
使用path.extname()方法,可以获取路径中的扩展名部分:
const path=require("path"); //定义一个文件的存放路径 const fpath="/a/b/c/index.html"; const ext=path.extname(fpath); console.log(ext);//输出 .html
http模块
什么是http模块
什么是客户端
在网络节点中,负责消费电脑资源的电脑,叫做客户端
负责对外提供网络资源的电脑,叫做服务器
http模块是Node.js官方提供的、用来创建web服务器的模块。通过http模块的http.createServer()方法,就能方便地把一台普通地电脑,变成web服务器,从而对外提供web资源服务。
如果要希望使用http模块创建web服务器,则需要先导入它
const http = require("http");
我们可以通过基于Node.js提供的http模块,通过几行简单的代码,就能轻松的手写一个服务器软件,从而对外提供web服务
服务器的相关概念
1.IP地址
IP地址就是互联网上每台计算机的唯一地址,因此IP地址具有唯一性。如果把"个人电脑"比作"一台电话",那么"IP地址"就相当于"电话号码",只有在知道对方IP地址的前提下,才能与对应的电脑之间进行数据通信
IP地址的格式:通常用"点分十进制"表示成(a.b.c.d)的形式,a,b,c,d都是0~255之间的十进制整数。例如:用点分十进制表示的IP地址(192.168.1.1)。
①互联网中每台web服务器,都有自己的IP地址,例如:大家可以在windows的终端中运行 ping www.baidu.com 命令,即可查看到百度服务器的IP地址。
②在开发期间,自己的电脑既是一台服务器,也是一个客户端,为了方便测试,可以在自己的浏览器中输入127.0.0.1这个IP地址,就能把自己的电脑当作一台服务器进行访问了
2.域名或域名服务器
尽管IP地址能够唯一的标记网络上的计算机,但IP地址是一长串数字,不直观,而且不便于记忆,于是人们又发明了另一套字符型的地址方案,即所有的域名(Domain Name)地址
IP地址和域名是一一对应的关系,这份对应关系存放在一种叫做域名服务器(DNS,Domain name server)的电脑中,使用者只需要通过好记得域名访问对应的服务器即可,对应的转换工作由域名服务器实现。因此,域名服务器就是提供IP地址和域名之间的转换服务的服务器。
注意:
①单纯使用IP地址,互联网中的电脑也能够正常工作,但是有了域名的加持,能让互联网的世界变得更加方便
②在开发测试期间,127.0.0.1对应的域名是 localhost,他们都是代表我们自己的这台电脑,在使用效果上没有任何区别。
端口号:
在一台电脑中,可以运行成百上千个web服务。每个web服务都对应一个唯一的端口号,客户端发送过来的网络请求,通过端口号,可以被准确的交给对应的web服务器进行处理。
创建web服务的基本步骤
①导入http模块
const http = require("http");
②创建web服务器实例
通过http.createServer()方法,即可快速创建一个web服务器
const server = http.createServer();
③为服务器实例绑定request事件,监听客户端的请求
.on 方法为服务器绑定一个 request 事件
server.on("request",(req,res)=>{ //只要有客户端来请求我们自己的服务器,就会触发request事件,从而调用这个事件处理函数 console.log("Someone visit oue web server") })
④启动服务器
调用服务器实例的.listen()方法,即可启动当前的web服务器实例
调用server.listen(端口号,cd回调)方法,即可启动web服务器
server.listen(80,()=>{ console.log(“http server running at http://127.0.0.1”) })
// 导入http模块 const http = require("http"); // 创建web服务器实例 const server = http.createServer(); // 为服务器实例绑定 request事件,监听客户端的请求 server.on("request", function (req, res) { console.log("Some visit our web server") }) // 启动服务器 server.listen(8055, function () { console.log("server running at http://127.0.0.1:8055"); })
req请求对象
只要服务器接收到了客户端的请求,就会调用通过server.on()为服务器绑定的request事件处理函数.
如果想要在事件处理函数中,访问与客户端相关的数据和属性,可以使用如下的方式:
server.on(‘request’,(req)=>{ //req是请求对象,它包含了与客户端相关的数据和属性,如下 //req.url 是客户端请求的URL地址 //req.method 是客户端的method请求类型 const str=”Your request url is ${req.url} ,and request method is ${req.method}” consle.log(str) })
const http=require("http"); const server=http.createServer(); //req 是请求对象,包含了与客户端相关的数据和属性 server.on("request",(req)=>{ // req.url 是客户端请求的 URL 地址 const url=req.url; // req.method 是客户端请求的 method 类型 const method =req.method; const str= `your request url is ${url},and request method is ${method}`; console.log(str) }) server.listen(80,()=>{ console.log("server running at http://127.0.0.1") })
res响应对象
在服务器的request事件处理函数中,如果想访问与服务器相关的数据和属性,可以使用如下的方式:
server.on(“request”,(req,res)=>{ //res 是响应对象,它包含了与服务器相关的数据和属性,例如:要发送到客户端的字符串 const str =`Your request url is ${req.url},and request method is ${req.methos}` //res.end()方法的作用 //向客户端发送指定的内容,并结束这次请求的处理过程 res.end(str) })
const http=require("http"); const server=http.createServer(); server.on("request",(req,res)=>{ //req.url 是客户端请求的url const url=req.url; // req.method 是客户端请求的method const method=req.method; const str=`Your request url is ${url},and request method is ${method}`; console.log(str); // 调用 res.end() 方法,向客户端响应一些内容 res.end(str) }) server.listen(80,()=>{ console.log("server running at http://127.0.0.1") })
解决中文乱码问题
当调用 res.end()方法,向客户端发送中文内容的时候,会出现乱码问题,此时,需要动手设置内容的编码格式:
server.on(“request”,(req,res)=>{ //发送内容包含中文 const str =”你请求的url地址 是${req.url},请求的method类型是${req.method}” //为了防止中文显示乱码的问题,需要设置响应头 Content-Type的值为 text/html:charset=utf-8 res.setHeader(‘Content-Type’,’text/html;charset=utf-8’) //把包含中文的内容,响应给客户端 res.end(str) })
// 导入http模块 const http = require("http"); //创建web服务器实例 const server = http.createServer(); // 为服务器实例绑定request事件,监听客户端的请求 server.on("request", (req, res) => { // req.url 是客户端请求的URL地址 const url = req.url; // req.method 是客户端的method请求类型 const method = req.method; //发送的内容包含中文 const str = `你请求的url地址是${url},请求的method类型是 ${method}`; console.log(str); // 为了防止中文显示乱码的问题,需要设置响应头 Content-Type 的值为text/html:charset=utf-8 res.setHeader("Content-Type","text/html; charset=utf-8") // res.end()方法的作用 // 向客户端发送指定的内容,并结束这次请求的处理过程 // 把包含中文的内容,响应给客户端 res.end(str) }) // 启动服务器 server.listen(80, () => { console.log("server running at http://127.0.0.1") })
根据不同的 url 响应不同的 html 内容
核心实现步骤
- 获取请求的 url 地址
- 设置默认的响应内容为 404 Not found
- 判断用户请求的是否为 / 或 /index.html 首页
- 判断用户请求的是否为 /about.html 关于页面
- 设置 Content-Type 响应头,防止中文乱码
- 使用 res.end() 把内容响应给客户端
const http = require("http"); const server = http.createServer(); server.on("request", (req, res) => { // ①获取请求url地址 const url = req.url; // ②设置默认的响应内容为404 Not found let content = "<h1>404 Not found!!!</h1>" // ③判断用户请求的是否为 / 或 /index.html首页 // ④判断用户请求的是否为 /about.html关于页面 if (url === '/' || url === '/index.html') { content = "<h1>首页</h1>" } else if (url === '/about.html') { content = "<h1>关于页面</h1>" } // ⑤设置Content-Type响应头,防止中文乱码 res.setHeader("Content-Type", "text/html; charset=utf-8"); // ⑥使用res.end()把内容响应给客户端 res.end(content); }) server.listen(80, function () { console.log('server running at http://127.0.0.1') })
模块化
模块化的基本概念
1.什么是模块化
模块化 是指解决一个 复杂问题 时,自顶向下逐层 把系统划分成若干模块的过程 。对于整个系统来说, 模块是可组合、分解和更换的单元 。2. 编程领域中的模块化编程领域中的模块化,就是 遵守固定的规则 ,把一个 大文件 拆成 独立并互相依赖 的 多个小模块 。把代码进行模块化拆分的好处:① 提高了代码的 复用性② 提高了代码的 可维护性③ 可以实现 按需加载3.模块化规范模块化规范 就是对代码进行模块化的拆分与组合时,需要遵守的那些规则。例如:⚫ 使用什么样的语法格式来 引用模块⚫ 在模块中使用什么样的语法格式 向外暴露成员模块化规范的好处 :大家都遵守同样的模块化规范写代码,降低了沟通的成本,极大方便了各个模块之间的相互调用, 利人利己。
Node.js 中的模块化
Node.js 中模块的分类Node.js 中根据模块来源的不同,将模块分为了 3 大类,分别是:⚫ 内置模块 (内置模块是由 Node.js 官方提供的,例如 fs、path、http 等)⚫ 自定义模块 (用户创建的每个 .js 文件,都是自定义模块)⚫ 第三方模块 ( 由第三方开发出来的模块 ,并非官方提供的内置模块,也不是用户创建的自定义模块, 使用前需要先下载 )
加载 模块使用强大的 require() 方法,可以加载需要的 内置模块 、 用户自定义模块 、 第三方模块 进行使用。例如://加载内置的fs模块 const fs = require("fs"); //加载用户自定义模块 const custum = require("custum"); //加载第三方模块 const moment = require("moment");
注意 :使用 require() 方法加载其它模块时,会执行被加载模块中的代码。