初识Node.js与内置模块
目标:
- 能够知道什么是 Node.js
- 能够知道 Node.js 可以做什么
- 能够说出 Node.js 中的 JavaScript 的组成部分
- 能够使用 fs 模块读写操作文件
- 能够使用 path 模块处理路径
- 能够使用 http 模块写一个基本的 web 服务器\
1. 初识Node.js
1.1 什么是Node.js
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。
Node.js 的官网地址: https://nodejs.org/zh-cn/
1.2 Node.js可以做什么?
Node.js 作为一个 JavaScript 的运行环境,仅仅提供了基础的功能和 API。然而,基于 Node.js 提供的这些基础能,很多强大的工具和框架如雨后春笋,层出不穷,所以学会了 Node.js ,可以让前端程序员胜任更多的工作和岗位:
- 基于 Express 框架(http://www.expressjs.com.cn/),可以快速构建 Web 应用
- 基于 Electron 框架(https://electronjs.org/),可以构建跨平台的桌面应用
- 基于 restify 框架(http://restify.com/),可以快速构建 API 接口项目
- 读写和操作数据库、创建实用的命令行工具辅助前端开发、etc…
总之:Node.js 是大前端时代的“大宝剑”,有了 Node.js 这个超级 buff 的加持,前端程序员的行业竞争力会越来越强!
1.3 Node.js怎么学?
Node.js 的学习路径:JavaScript 基础语法 + Node.js 内置 API 模块(fs、path、http等)+ 第三方 API 模块(express、mysql 等)
1.4 Node.js 环境的安装
如果希望通过 Node.js 来运行 Javascript 代码,则必须在计算机上安装 Node.js 环境才行。
安装包可以从 Node.js 的官网首页直接下载,进入到 Node.js 的官网首页(https://nodejs.org/en/),点击绿色的按钮,下载所需的版本后,双击直接安装即可。
LTS版本是长期稳定版本 Current是新特性尝鲜版
查看已安装的 Node.js 的版本号
打开终端,在终端输入命令 node –v 后,按下回车键,即可查看已安装的 Node.js 的版本号。
node -v
如何在Node.js环境中执行JavaScript代码:
1. 打开终端
2. 输入 node 要执行的js文件的路径
node 文件路径
2. fs文件系统模块
2.1 什么是fs文件系统模块
fs 模块是 Node.js 官方提供的、用来操作文件的模块。它提供了一系列的方法和属性,用来满足用户对文件的操作需求。
例如:
- fs.readFile() 方法,用来读取指定文件中的内容
- fs.writeFile() 方法,用来向指定的文件中写入内容
如果要在 JavaScript 代码中,使用 fs 模块来操作文件,则需要使用如下的方式先导入它
const fs = request('fs)
2.2 fs.readFile - 读取指定文件中的内容
使用fs.readFile()方法,可以读取指定文件中的内容,语法格式如下:
fs.readFile(path[options],callback)
参数解读:
参数1:必选参数,字符串,表示文件的路径。
参数2:可选参数,表示以什么编码格式来读取文件。
参数3:必选参数,文件读取完成后,通过回调函数拿到读取的结果。
示例代码:
const fs = require('fs')
fs.readFile('./files/11.txt','utf8',function(err,dataStr) {
console.log(err)
console.log('--------')
console.log(dataStr)
})
判断文件是否读取成功
可以判断err对象是否为null,从而知晓文件读取的结果:
cosnt fs = require('fs')
fs.readFile('./files/1.txt','utf8',function(err,reasult){
if(err){
return console.log('文件读取失败!'+err.message)
}
console.log('文件读取成功,内容是:'+result)
})
2.3 fs.writeFile() - 向指定的文件中写入内容
使用 fs.writeFile() 方法,可以向指定的文件中写入内容,语法格式如下:
fs.writeFile(file,data[,options],callback)
参数解读:
参数1:必选参数,需要指定一个文件路径的字符串,表示文件的存放路径。
参数2:必选参数,表示要写入的内容。
参数3:可选参数,表示以什么格式写入文件内容,默认值是 utf8。
参数4:必选参数,文件写入完成后的回调函数。
示例代码:
const fs = require('fs)
fs.writeFile('./files/2.txt','Hello Node.js!',function(err){
console.log(err)
})
判断文件是否写入成功
//可以判断 err 对象是否为 null,从而知晓文件写入的结果:
const fs = require('fs)
fs.writeFile('./files/2.txt','Hello Node.js!',function(err){
if(err){
return console.log('文件写入失败!',err.message)
}
console.log('文件写入成功!')
})
2.4 fs 模块 - 路径动态拼接的问题
在使用 fs 模块操作文件时,如果提供的操作路径是以 ./ 或 ../ 开头的相对路径时,很容易出现路径动态拼接错误的问题。
原因:代码在运行的时候,会以执行 node 命令时所处的目录,动态拼接出被操作文件的完整路径。
解决方案:在使用 fs 模块操作文件时,直接提供完整的路径,不要提供 ./ 或 ../ 开头的相对路径,从而防止路径动态拼接的问题。
// 不要使用 ./ 或 ../ 这样的相对路径
fs.readFile('./files/1.txt','utf8',function(err,dataStr){
if(err) return console.log('读取文件失败!',err.message)
console.log(dataStr)
})
// __dirname 表示当前文件所处的目录
fs.readFile(__dirname+'files/1.txt'.'utf8',function(err,dataStr){
if(err) return console.log('读取文件失败!',err.message)
console.log(dataStr)
})
3. path路径模块
3.1 什么是path路径模块
path 模块是 Node.js 官方提供的、用来处理路径的模块。它提供了一系列的方法和属性,用来满足用户对路径的处理需求。
例如:
- path.join() 方法,用来将多个路径片段拼接成一个完整的路径字符串
- path.basename() 方法,用来从路径字符串中,将文件名解析出来
导入path模块
const path = require('path')
3.2 path.join()方法 - 路径拼接
path.join([...paths])
参数解读:
- …paths 路径片段的序列
- 返回值:
代码演示:
const pathStr = path.join('/a','/b/c','../','./d','e')
console.log(pathStr) // 输出 \a\b\d\e
const pathStr2 = path.join(__dirname,'./files/1.txt')
console.log(pathStr2) // 输出 当前文件所处目录\files\1.txt
注意:今后凡是涉及到路径拼接的操作,都要使用 path.join() 方法进行处理。不要直接使用 + 进行字符串的拼接
3.3 path.basename()
使用 path.basename() 方法,可以获取路径中的最后一部分,经常通过这个方法获取路径中的文件名,语法格式如下
path.basename(path[ext])
参数解读:
- path 必选参数,表示一个路径的字符串
- ext 可选参数,表示文件扩展名
- 返回: 表示路径中的最后一部分
示例代码:
const fpath = '/a/b/c/index.html'
var fullName = path.basename(fpath)
console.log(fullName) // 输出 index.html
var nameWithouExt = path.basename(fpath,'.html'
console.log(nameWithouExt) // 输出 index
3.4 path.extname()
使用 path.extname() 方法,可以获取路径中的扩展名部分,语法格式如下:
path.extname(path)
参数解读:
- path 必选参数,表示一个路径的字符串
- 返回: 返回得到的扩展名字符串
示例代码:
const fpath = '/a/b/c/index.html' // 路径字符串
const fext = path.extname(fpath)
console.log(fext) // 输出 .html
4.http模块
http 模块是 Node.js 官方提供的、用来创建 web 服务器的模块。通过 http 模块提供的 http.createServer() 方法,就能方便的把一台普通的电脑,变成一台
Web 服务器,从而对外提供 Web 资源服务。
如果要希望使用 http 模块创建 Web 服务器,则需要先导入它:
const http = require('http')
什么是客户端、什么是服务器?
在网络节点中,负责消费资源的电脑,叫做客户端;负责对外提供网络资源的电脑,叫做服务器
进一步理解 http 模块的作用
服务器和普通电脑的区别在于,服务器上安装了 web 服务器软件,例如:IIS、Apache 等。通过安装这些服务器软件,就能把一台普通的电脑变成一台 web 服务器。
在 Node.js 中,我们不需要使用 IIS、Apache 等这些第三方 web 服务器软件。因为我们可以基于 Node.js 提供的http 模块,通过几行简单的代码,就能轻松的手写一个服务器软件,从而对外提供 web 服务。
4.1 创建最基本的 web 服务器
1. 导入http模块
如果希望在自己的电脑上创建一个 web 服务器,从而对外提供 web 服务,则需要导入 http 模块:
const http = request('http')
2. 创建web服务器实例
调用 http.createServer() 方法,即可快速创建一个 web 服务器实例:
const server = http.createServer()
3. 为服务器实例绑定request事件,监听客户端的请求
为服务器实例绑定 request 事件,即可监听客户端发送过来的网络请求:
//使用服务器实例的 .on方法,为服务器绑定一个 request 事件
server.on('request',(req,res)=>{
//只要有客户端来请求我们自己的服务器,就会触发 request 事件,从而调用这个事件处理函数
console.log('Someone visit our web server.')
})
4. 启动服务器
调用服务器实例的 .listen() 方法,即可启动当前的 web 服务器实例:
// 调用 server.listen(端口号,cb回调)方法,即可启用 web 服务器
server.listen(80,()=>{
console.log('http server running at http://127.0.0.1')
})
4.2 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}console.log(str)
})
4.3 res 响应对象
在服务器的 request 事件处理函数中,如果想访问与服务器相关的数据或属性,可以使用如下的方式:
server.on( 'request ', (req,res) =>{
// res是响应对象,它包含了与服务器相关的数据和属性,例如:
// 要发送到客户端的字符串
const str = 'Your request url is ${req.url},and request method is ${req.method}`
// res.end()方法的作用:
//向客户端发送指定的内容,并结束这次请求的处理过程res.end(str)
}
4.4 解决中文乱码问题
当调用 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)
})
4.5 案例 - 实现 clock 时钟的web服务器
步骤1 - 导入需要的模块
// 1.1导入http模块
const http = require( " http ' )
//1.2导入fs文件系统模块
const fs = require( 'fs ' )
//1.3 导入path路径处理模块
const path = require( ' path' )
步骤2 - 创建基本的 web 服务器
// 2.1创建web服务器
const server =http.createServer()
// 2.2监听 web服务器的request事件
server.on( ' request', function(req,res) {})
// 2.3启动 web服务器
server.listen( 80,function(){
console.log( ' server listen at http://127.0.0.1')}
步骤3 - 将资源的请求 url 地址映射为文件的存放路径
// 3.1获取到客户端请求的url地址
const url = req.url
// 3.2把请求的url 地址,映射为本地文件的存放路径
const fpath = path.join(__dirname,url)
步骤4 - 读取文件的内容并响应给客户端
// 4.1根据"映射"过来的文件路径读取文件
fs.readFile(fpath,"utf8 ' , (err, dataStr) =>{
// 4.2读取文件失败后,向客户端响应固定的"错误消息”
if(err) return res.end( '404 Not fount. ')
// 4.3读取文件成功后,将"读取成功的内容"响应给客户端
res.end(dataStr)
})
3. 步骤5 – 优化资源的请求路径
//***将3.2的实现方式,改为如下代码u,***
// 5.1预定义空白的文件存放路径
let fpath = '=
if (url === '/' ) {
//5.2如果请求的路径是否为/,则手动指定文件的存放路径
fpath = path.join(__dirname,"./clock/index.html ' )
}else{
//5.3如果请求的路径是否为/,则手动指定文件的存放路径
fpath=path.join(__diname,'./clock',url)
}