文章目录
1. path模块(路径)
-
path模块导入
const path = require('path'); // 系统模块
-
path.basename()
:获取路径最后一部分。第二个参数表示扩展文件名,指定后,获取的是不包含扩展文件名的部分。const name = path.basename('/Users/LEO/Desktop/Code/node/02.js'); console.log(name); // 02.js const name = path.basename('/Users/LEO/Desktop/Code/node/02.js','.js'); console.log(name); // 02
-
path.dirname()
:返回一个路径的目录名。const name = path.dirname('/Users/LEO/Desktop/Code/node/02.js'); console.log(name); // /Users/LEO/Desktop/Code/node
-
path.extname()
:返回路径的扩展名,即从路径的最后一部分中的最后一个.
(句号)字符到字符串结束。 如果路径的最后一部分没有.
或路径的文件名的第一个字符是.
,则返回一个空字符串const name = path.extname('/Users/LEO/Desktop/Code/node/02.js'); console.log(name); // .js
-
path.parse()
:返回一个对象,对象的属性表示路径的元素const name = path.parse('/Users/LEO/Desktop/Code/node/02.js'); console.log(name); /* { root: '/', // 文件的根路径 dir: '/Users/LEO/Desktop/Code/node', // 文件的全路径 base: '02.js', // 文件全名称 ext: '.js', // 扩展名 name: '02' // 文件名 } */
-
path.format(obj)
:从一个对象返回一个路径字符串.const obj = { root:'/', dir:'/Users/LEO/Desktop', base:'1.txt' } console.log(path.format(obj)); // /Users/LEO/Desktop/1.txt - `path.isAbsolute()`:判断一个路径是否为绝对路径 console.log(path.isAbsolute('/Users/LEO/Desktop/1.txt')); // true console.log(path.isAbsolute('Users/LEO/Desktop/1.txt')); // false
-
path.join()
:将给定符合规范的字符串拼接成完整路径。console.log(path.join('/a','/b','c','d')); // /a/b/c/d console.log(path.join('/a','/b','c','d','../')); // /a/b/c/
-
path.normalize()
:规范化路径console.log(path.normalize('/foo/bar//baz/asdf/quux/..')); // /foo/bar/baz/asdf
-
path.relative(from,to)
:返回从 from 到 to 的相对路径(基于当前工作目录)console.log(path.relative('/Users/LEO/Desktop/Code/node/src/','/Users/LEO/Desktop/Code/node/01.js')); // ../01.js
-
path.resolve()
:把一个路径或路径片段的序列解析为一个绝对路径.console.log(path.resolve('/foo/bar', './baz')); // 返回: '/foo/bar/baz' console.log(path.resolve('/foo/bar', '/tmp/file/')); // 返回: '/tmp/file' 因为'/tmp/file已经是一个绝对路径 所以不再拼接 console.log(path.resolve('wwwroot', 'static_files/png/', '../gif/image.gif')); // /Users/LEO/Desktop/Code/node/wwwroot/static_files/gif/image.gif // 拼接到wwwroot 还不是绝对路径 所以会把当前工作目录拼接成绝对路径
-
path.sep
:路径分隔符.Windows 上是\
,Unix\Linux 上是/
console.log(path.sep); // /
-
path.delimiter
:环境变量分隔符. Windows 上是;
,Unix\Linux上是:
console.log(path.delimiter); // :
2. fs模块(文件系统)
-
对文件进行增删改查操作,每一个操作方法都有同步(sync)和异步(async),默认不加sync的都是异步
-
异步都是使用的回调,同步都是返回需要接收
// fs模块导入 const fs = require('fs'); // 系统模块
2.1 文件操作
2.1.1 文件读取
-
fs.stat()
:查看文件状态fs.stat('./01.js', (err, stats) => { if (err) { console.log(err); return; } console.log(stats); }) // stats两个常用两个方法 fs.stat('./01.js', (err, stats) => { if (err) { console.log(err); return; } // 读取的文件 if (stats.isFile()) { console.log('文件'); // 读取的目录 } else if (stats.isDirectory()) { console.log('目录'); } }) // stats常用属性 // atime: 文件访问时间 // ctime: 文件状态信息发生变化的时间 // mtime: 文件数据内容发生变化的时间 // birthtime: 文件创建的时间
-
fs.statSync()
:查看文件状态(同步)console.log(1); const res = fs.statSync('./01.js'); console.log(res); console.log(2);
-
fs.readFile(path[, encoding], callback)
:异步地读取一个文件的全部内容.path为文件路径,可选参数options为编码格式,callback异步回调。// 没有指定编码 输出为buffer fs.readFile(__dirname + '/01.js', (err, data) => { if (err) throw err; console.log(data.toString()); }); // 指定输出编码,不写默认读取的是 buffer fs.readFile(__dirname + '/01.js', 'utf8', (err, data) => { if (err) throw err; console.log(data); });
-
fs.readFileSync(path[, encoding], callback)
:同步读取文件内容。const file = fs.readFileSync(__dirname + '/01.js', 'utf8'); console.log(file);
2.1.2 文件写入
-
fs.writeFile(file, data[, encoding], callback)
:异步地写入数据到文件,如果文件已经存在,则替代文件,如果没有文件会创建一个文件。data 可以是一个字符串或一个 buffer。encoding 默认为 ‘utf-8’。fs.writeFile(__dirname + '/03.js', 'Hello Node.js', (err) => { if (err) throw err; console.log('写入成功!'); });
-
fs.writeFileSync(file, data[, encoding])
:同步地写入数据到文件。fs.writeFile(__dirname + '/03.js', 'Hello Node.js');
-
fs.appendFile(path, data[, options], callback)
:异步地将数据追加到文件,如果该文件尚不存在,则创建该文件。data
可以是字符串或<Buffer>
。
2.1.3 文件流操作
-
fs.createWriteStream(path)
:创建一个文件可写流. -
fs.createReadStream(path)
::创建一个文件可读流.// 创建一个文件读取流 let readStream = fs.createReadStream(path.join(__dirname, '../../node/day01/04-view/01-初识nodejs.avi')); // 创建一个文件写入流 let writeStream = fs.createWriteStream(path.join(__dirname, '../../', '01.avi')); // 第一种: 基于事件的文件流读写 // 开始读取文件 readStream.on('data', (chunk) => { // 开始写入文件 writeStream.write(chunk); }) // 文件写入完毕 readStream.on('end', () => { console.log('写入完毕') }) // 第二种: 通过管道连接写入 readStream.pipe(writeStream);
2.2 目录操作
2.2.1 创建目录
-
fs.mkdir(path, callback)
:异步创建目录fs.mkdir(path.join(__dirname,'test'),(err)=>{ console.log(err); })
-
fs.mkdirSync(path)
:同步创建目录fs.mkdirSync(path.join(__dirname,'hello'))
2.2.2 读取目录
-
fs.readdir(path,callback)
:异步读取目录fs.readdir(__dirname, (err, files) => { files.forEach((item, index) => { fs.stat(path.join(__dirname, item), (err, stats) => { if (stats.isFile()) { console.log(item + '文件') } else if (stats.isDirectory()) { console.log(item + '目录') } }) }) })
-
fs.readdirSync(path)
:同步读取目录var files = fs.readdirSync(__dirname); console.log(files);
2.2.3 删除目录
-
fs.rmdir(path,callback)
:异步删除指定目录fs.rmdir(path.join(__dirname,'test'),(err)=>{ console.log(err); })
-
fs.rmdirSync(path)
:同步删除指定目录fs.rmdirSync(path.join(__dirname,'test'))
3. http模块(超文本传输协议)
3.1 开启服务
// 导入http系统模块
const http = require("http")
// 创建服务
let server = http.createServer()
// 监听请求
server.on("request", (request, response) => {
// 写入响应内容
response.write("你好")
// 响应完后需要结束,不然会一直加载
response.end("") // 这里面也可以写入
})
// 监听端口
server.listen(9527, () => {
console.log("服务已开启: http://127.0.0.1:9527")
})
3.2 url
解码与编码
// 进行编码
encodeURI("url地址")
// 进行解码
decodeURI("url地址")
3.3 get和post请求参数
// get请求通过url截取
// post请求通过 ==>
request.on("data", (url) => {
console.log(url)
})
3.4 页面重定向
// 只能3开头
response.writeHead(302, {
// 重定向的地址
"Location": "http://127.0.0.1:9527/user.html"
})
// 重定向也需要结束当前页面
response.end()
还有很多模块!!
4. 自定义模块
- 在node中又分为全局作用域和模块作用域
4.1 global(全局作用域)
-
在node中没有window,但是有一个global全局作用域
-
在global上面挂载属性,即使没有导出当前属性也可以使用
// demo1.js文件中 global.num = 10 console.log(global.num); // 10 // demo2.js文件中,可以不用导出num,但是这两个文件必须建立联系,这个num就是全局变量 require("./demo1.js") console.log(global.num); // 10
4.2 模块作用域
-
require(导入)
// commonJS 的导入导出 require("文件路径") // 自定义模块 require("fs/path") // 系统模块
-
exports(导出)
// 没被导出的属性,导入的对象接收不到 // demo1.js文件 let num = 10 let str = "20" let obj = {} // 这种方法只能单个导出,但是导入的时候还是一个对象 exports.num = num exports.str = str // demo2.js文件 console.log(require("./demo1.js")) // { num: 10, str: '20' }
-
module.exports(模块导出)
// demo1.js文件 let num = 10 let str = "20" let obj = {} // 这种方法可以导出一个对象 module.exports = { num, str, obj } // demo2.js文件 console.log(require("./demo1.js")) // { num: 10, str: '20', obj: {} }
5. 第三方包(模块)
// 需要使用npm安装这个包
const $ = require("jquery")
5.1 包的查找规则
// 会在当前目录下node_modules中查找,如果没有会在上层目录查找
// 一直到最上层,还没有找到就会报错
require("三方包")