1.Node.js常见内置模块
1.fs模块
fs模块
是Node.js官方提供的,用来操作文件的模块。它提供了一系列的方法和属性,来满足用户对文件的操作需求。如文件的读写:fs.readFile(),fs.wirteFile()。
1.读取指定文件中的内容
fs.readFile(path[,options],callback])
// 1.导入fs模块,来操作文件
const fs = require('fs')
// 2.调用readFile()方法读取文件
fs.readFile('./files/test.txt', 'utf8', function (err, dataStr) {
if (err) return console.log('读取文件失败!' + err.message)
console.log('读取文件成功!' + dataStr)
})
path
: 字符串型型,表示文件的路径options
:可选参数,表示以什么编码格式读取文件,默认是utf-8
callback
: 文件读取完成后,通过回调函数拿到读取的结果- 如果文件读取成功,则
err
的值是null
。如果读取失败,则err的值为错误对象 - 如果读取失败,
dataStr
的值为undefined
2.向指定的文件中写入内容
fs.wirteFile(file,data[,option],callback)
const fs = require('fs')
fs.writeFile('./files/test3.txt', 'hello node', function (err) {
if (err) return console.log('写入文件失败!' + err.message)
console.log('文件写入成功')
})
file
: 需要指定一个文件路径的字符串,表示文件的存放路径data
: 表示要写入的文件内容fs.writeFile()
方法只能用来创建文件,不能用来创建路径(目录)- 重复调用fs.writeFile()方法写入同一个文件,新内容会覆盖旧内容
3.fs模块路径动态拼接的问题
在使用fs模块操作文件时,如果提供的操作路径是以./
或../
开头的相对路径时,很容易出现路径动态拼接错误的问题。
- 原因: 在代码运行的时候,会执行以node命令时所处的目录,动态的拼接出被操作文件的完整路径
解决方案:
const fs = require('fs')
fs.readFile(__dirname + '/files/test.txt', (err, dataStr) => {
if (err) return console.log('文件读取失败!' + err.message)
console.log('文件读取成功!' + dataStr)
})
__dirname
:表示当前文件所处的目录
2.path模块
path模块
是Node.js官方提供的、用来处理路径的模块。
path([...path])
1.路径拼接的使用
path.join()
const fs = require('fs')
const path = require('path')
fs.readFile(path.join(__dirname, './files/test.txt'), (err, dadaStr) => {
if (err) return console.log('文件读取失败!' + err.message)
console.log('文件读取成功!' + dadaStr)
})
- 遇到路径拼接的操作,我们可以使用path.join()更方便灵活
2.获取文件名
path.basename(path[,ext])
const path = require('path')
// 定义存放文件的路径
const fpath = 'a/b/c/index.html'
const filename = path.basename(fpath)
console.log(filename) // index.html
ext
: 可选参数,表示文件扩展名
可以使用path.basename()指定第二个参数来移除文件扩展名:
const withoutExt = path.basename(fpath, '.html')
console.log(withoutExt) // index
3.获取文件扩展名
path.extname(path)
const path = require('path')
const fpath = 'a/b/c/index.html'
const fExtName = path.extname(fpath)
console.log(fExtName) // .html
3.http模块
http模块
是由Node.js官方提供的、用来创建web服务器的模块。
1.http模块创建web服务器
// 1. 导入http模块
const http = require('http')
// 2. 创建web服务器实例
const server = http.createServer()
// 3. 为服务器实例绑定request事件,监听客户端向服务端发送的网络请求
server.on('request', function (req, res) {
console.log('Someone visit our web server.')
})
// 4. 启动服务器
server.listen(8080, function () {
console.log('server running at http://127.0.0.1:8080')
})
server.listen(端口号,callback)
: 监听服务器上的端口号,并返回调用结果
server.on('request', (req, res) => {
// 获取客户端的url
const url = req.url
// 获取客户端的请求类型
const method = req.method
const str = `Your request url is ${url},and method is ${method}`
console.log(str)
// 响应处理结果
res.end(str)
})
req
:请求对象,它包含了与客户端相关的数据和属性res
:响应对象,它包含了服务器相关的数据或属性res.end()
:向客户端发送指定的内容,并结束这次请求的处理过程
2.解决中文乱码问题
res.setHeader()
res.setHeader('Content-Type', 'text/html;charset=utf-8')
- 手动设置
Content-Type
属性,解决中文乱码问题
2.模块化
模块化
是指解决一个复杂问题时,自顶向下逐层把系统划分为若干模块的过程。对于整个系统来说,模块是可组合、分解和更换的单元。
Node.js中根据模块来源不同,将模块分为三大类:内置模块
、自定义模块
、第三方模块
。
Node.js遵循了CommonJs模块化
规范,CommonJS规定了模块的特性和各模块之间如何相互依赖。
CommonJs规定:
- 每个模块内部,
module
变量代表当前模块 - module变量是一个对象,它的
exports
属性(即module.exports
)是对外的接口 - 加载某个模块,其实是加载该模块的module.exports属性。require()方法用于加载模块。
1.模块作用域
在自定义模块中定义的变量、方法等成员,只能在当前模块内被访问,这种模块级别的访问限制,叫做模块作用域。
示例:
// 01_module.js
const uname = 'pancc'
function writeJS() {
console.log('正在写JS的' + uname)
}
// test.js
const con = require('./01_module.js.js')
console.log(con) // {} 并不能访问到01_module.js 里的变量、方法
- 只在当前的
.js
文件中有作用,防止了全局变量污染的问题
在每个.js自定义模块中都有一个module对象,它里面存储了和当前模块有关的信息。
2.向外共享成员
module.exports
// 01_module.js
const age = 18
// 向module.exports对象挂载uname属性
module.exports.uname = 'pancc'
// 向module.exports对象挂载age属性
module.exports.age = age
// test.js
const con = require('01_module.js')
console.log(con) // { uname:'pancc',age:18}
- 在自定义模块中,可以使用module.exports对象,将模块内的成员共享出去,供外界使用
- 外界用require()方法导入自定义模块时,得到的就是module.exports所指的对象(默认是
{}
) - 01_module.js向外共享了name和age,test.js导入该模块后,就能使用了
共享多个成员
const uname = 'pancc'
const age = 18
module.exports = {
uname,
age,
}
可以使用exports代替module.exports
exports = {
uname,
age,
}
- 由于module.exports单词写起来复杂多,Node.js提供了exports对象。
- 默认情况下,exports和module.exports指向同一个对象。
- 为了防止混乱,同一个模块中建议不要同时的使用exports和module.exports
注意: 使用require()方法导入模块时,导入的结果,永远以module.exports指向的对象为准。