“Node.js:基础与运用“

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指向的对象为准。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值