Node.js
Node.js的定义
Node.js 是一个基于 Chrome V8 引擎 的 JavaScript 运行时环境
名词解释
- chrome V8引擎: 在chrome浏览器用来解析和执行js代码的工具;
- 运行时:理解为一个容器,用来运行代码的环境;这个环境让JS有读写文件,操作数据库,开启web服务器等能力 注意:Node.js 只是JS的服务端运行环境,不是一门语言(不需要学习新语言),而只需要学习它里面新的Api
中文网 :
Nodejs.cn/
nodejs.org/zh-cn/
Node.js作用
浏览器是JS的前端运行环境
Node.js是JS的后端运行环境
※ 延伸前端工程师的能力范围,探究后端工程师的工作内容
Node.js环境与浏览器环境的区别
在浏览器端:js由三部分组成:ECMAScript + BOM + DOM
在NoeJS端:由ECMAScript + 内置模块(fs, http, path等) + 第三方模块(别人开发的模块)
注意:NodeJS中没有DOM,也没有BOM,也没有window对象。
浏览器是JS的前端运行环境,Node.js是JS的后端运行环境
下载和安装Node.js环境
下载对应版本的安装包(nodejs.org/zh-cn/)
注意:
1.win10 可以随意安装任何版本的Node
2.但是win7只能安装12及其以下的版本Node 以往版本下载
点击下载到的安装包,一路下一步默认安装
注意:
1.不能安装到中文目录如d:/软件,建议一直点击next即可
2.安装完成之后, 它不会在桌面出现快捷图标
安装
找到你下载的安装包,
-
双击安装文件开始安装(不同系统选择对应的安装文件)
-
傻瓜式安装,一路 'next' 即可
注意:
- 建议安装目录所使用
英文路径
(不要安装在类似于 d:/软件/node) - 安装完成之后, 它不会在桌面出现快捷图标
打开小黑窗输入 node -v 能看到版本号表示安装成功
在任意文件夹中最上方的路径中输入cmd后回车即可打开
Node.js分为长期支持版和最新版本 ,我们推荐使用长期支持版,因为它最稳定,最新版包含新功能,可用于研究,它不稳定
Node.js安装目录不能有中文或特殊字符,建议一路点击next直到安装完毕
查看Node.js版本命令:node -v
小黑窗打开方式
小黑窗:是我们给 命令行工具 起的一个昵称
window系统打开小黑窗的几种方式
按 windows + R 运行窗口中输入cmd 回车即可打开
在任意目录的最上方路径输入框中输入 cmd 回车接口打开 (推荐)
在任意目录中按住 shift键 + 鼠标右键后在弹出菜单中点击 在此处打开命令窗口 或 在此处打开PowerShell窗口即可打开
在VSCode中,任意一个js文件上鼠标右键,选择在 集成终端中打开
苹果电脑操作: jingyan.baidu.com/article/375…
在Node环境下运行js代码
vscode中新建一个01nodejs执行体验.js,console.log()输出一段文本, 利用node执行后看到输出表示执行成功
步骤:
新建01nodejs执行体验.js
编写代码:console.log('nodejs执行输出啦');
打开小黑窗,输入 node 01nodejs执行体验.js 回车看结果
注意:node后面要加空格,格式: node 空格 要执行的js文件
在Node环境下运行各种js语法
步骤:
新建02node执行各种js语法.js
在文件中定义 let obj ={age:20}; let arr = [1,2,3]; node执行后打印obj和arr看看结果(能正常执行)
在文件中编写 if(1==1) {} else {} node执行后打印结果(能正常执行)
注意:node后面要加空格,格式: node 空格 要执行的js文件
在文件中编写 alert(1)node执行时时会报错(alert is not defined)表示node环境中没有window不能操作dom
在文件中编写 while(true){console.log(1);}node执行后会一直打印1,此时该如何停止呢?在小黑窗中按 ctrl + c 终止
学习常用的命令及按键
命令及键盘按键
复制和粘贴
在小黑窗中复制内容:选中内容,再点鼠标右键
把粘贴板中的内容复制到小黑窗: 直接在小黑窗点鼠标右键
核心模块-文件读写fs
Node中的模块分类
核心模块
就是nodejs自带的模块,在安装完nodejs之后,就可以任意使用啦。相当于学习js时使用的Math对象一样
自定义模块
程序员自己写的模块。相当于我们在学习js时的自定义函数
第三方包
其他程序员写好的模块,nodejs生态提供了一个专门的工具npm来管理第三方模块,例如我们前面学习的echarts等
nodejs官网查询核心模块
nodeapi官网:nodejs.org/dist/latest…
只要在官网中能查到的模块都是nodejs的核心模块
使用require导入模块
语法: const 变量名(自己随意取) = require('核心模块名');
建议:变量名 跟 模块名保持同名
const fs = require('fs')
const fs = require('fs')
console.log('测试1');
console.log('测试2');
console.log('测试3');
console.log('fs', fs);
// debugger // 打断点
// F5 启动调试 -> 选择 Node
// Shift + F5 停止调试
// Ctrl + Shift + Y 调试控制台
如果没有打断点 调试之后 fs模块的输出效果是以下示例
打断点之后才能像浏览器控制台看到的一样
例如:导入fs模块和Path核心模块的代码
fs.readFile异步读取文件内容
同步与异步的概念理解
同步:
多个功能按先后顺序执行,后面任务等待前面任务执行完毕后才会执行。
如平常大家讨论问题时说:让我说完,意思是说我说完你再说。
优缺点:如果前面任务执行太久会阻止后面任务的执行,降低程序执行性能,造成用户体验差,
优点是编程方式简单,便于理解执行过程。
异步:
和同步相反,也就是在发出一个功能调用时,不管没有没得到结果,都继续往下执行。 就像两个人吵架一样,各说各的,不管对方有没有说完。
优缺点:不会造成阻塞,提升了程序执行性能,用户体验好,
缺点是编程方式复杂,执行过程理解难度较大,会形成回调函数的嵌套。
异步的表现形式:以一个回调函数的方式来实现异步任务的执行
fs.readFile异步读取文件基本写法
语法:
fs.readFile(path[, options], callback)
参数:
- path,读取文件的路径(相对路径或绝对路径)
- options:读取文件的参数配置,通常用一个utf8字符串表示即可
- callback:读取完毕的回调函数(err,data)=>{ }
场景:在一个js文件中编写代码,读取同级目录下的1.txt文件中的内容打印到小黑窗上
步骤:
- 在day01文件夹下 创建 /异步读取文件/rd.js 和 /异步读取文件/1.txt两个文件
- 在1.txt中随便输入一个字符串内容
- 在rd.js中导入fs核心模块 const fs = require(‘fs’)
- fs.readFile(‘./1.txt’,’utf8’,(err,data)=>{ consloe.log(data); })
- 进入异步读取文件目录打开小黑窗,执行 node rd.js 看结果
注意:读取文本内容文件时,utf8参数要加上,不然打印出来的是一个Buffer二进制内容
// 导入fs模块
const fs = require('fs')
// 调用 fs.readFile() 方法读取文件
// 参数1:读取文件的存放路径
// 参数2:读取文件采用的编码格式 一般默认指定 utf8
// 参数3:回调函数,拿到读取失败和成功的结果 err datastr
fs.readFile('./123.txt', 'utf8', function(err, dataStr){
// 打印失败的结果
// 读取成功 则err的值为null 失败则为错误对象,datastr的值为undefined
console.log(err);
console.log('---------');
// 打印成功的结果
console.log(dataStr);
})
文件错误的情况下
const fs = require('fs')
fs.readFile('./123.txt', (err, data) => {
// typeof 检测类型
console.log('err', typeof err)
// 加 toString() 可以输出里面的内容
console.log('data', data.toString())
})
fs.readFileSync同步读取文件写法
语法:let res = fs.readFileSync(path[, options])
参数:
- path,读取文件的路径(相对路径或绝对路径)
- options:读取文件的参数配置,通常用一个utf8字符串表示即可
const fs = require('fs')
// Sync 同步的意思 按书写顺序运行
console.log(111)
const data = fs.readFileSync('./123.txt')
console.log('文本',data.toString());
const data2 = fs.readFileSync('./avatar_1.png')
console.log(333);
console.log('图片', data2);
同步读取文件处理错误
try catch语法:
try{ 放有可能出错的代码 } catch(err){ 报错后执行的代码,通常是输出错误 }
处理同步读取文件的错误
// 捕获同步读取文件的错误
const fs = require('fs')
try {
// 正常业务代码
console.log(123);
const data = fs.readFileSync('./123.txt')
console.log(456);
} catch (error) {
// 如果代码出错 catch会捕获错误
console.log('读取文件失败');
}
小结
同步读取文件的方法名叫 readFileSync
同步读取文件的内容如何获得? 直接用变量接收readFileSync的返回值
同步代码的错误处理使用try{}catch(){}处理,那么try中写什么代码 正常的逻辑的代码
catch中的代码是如何触发执行的 try中的代码出错后就会触发catch中的代码
fs核心模块写入文件
向指定文件中写入内容
fs.writeFile( ) 的语法格式
语法:
fs.writeFile(path,data[, options], callback)
特点:writeFile方法是覆盖式写入,后面的内容会将前面的内容覆盖
参数:
- path,被写入文件的路径(相对路径或绝对路径)
- data,要写入的内容,字符串格式
- options:写入文件的参数配置,默认是utf8编码
- callback:写入完毕的回调函数(err)=>{}
fs.writeFile异步写入内容到文件
场景:在一个js文件中编写代码,将一段文本写入到同级目录下的1.txt文件中
步骤:
- 在day01文件夹下 创建 /异步覆盖写入文件/wd.js 和 /异步覆盖写入文件/1.txt两个文件
- 在wd.js中导入fs核心模块 const fs = require(‘fs’)
- fs.writeFile(‘./1.txt’,’白日依山尽’,’utf8’,(err)=>{ consloe.log(‘写入成功’); })
- 进入异步覆盖写入文件目录打开小黑窗,执行 node wd.js 看结果
const fs = require('fs')
fs.writeFile('./133.txt', '6666', err => {
// 如果没有错误 err 的值为 null
if(err) return console.log('写入错误')
console.log('写入成功');
})
// 1、 覆盖写入 会覆盖原有的内容
// 2、 如果文件不存在会尝试自动创建文件
// 3、如果写入的路径是不存在的盘符 就会写入错误 比如 z: ./133.txt 不存在的盘符
异步写入对象数据格式
const fs = require('fs')
const arr = [ { id: 1 }, { id: 2 }]
/*
注意事项:
fs.writeFile() 第二个参数的格式要求为字符串
JSON.stringify() 把对象转换成JSON字符串
*/
fs.writeFile('./09-data.json', JSON.stringify(arr), err => {
if(err) return console.log('写入错误')
console.log('写入成功');
})
对json数据进行操作
创建一个json文件 写入一些对象
使用读写的功能,在json数据里新增一条对象
const fs = require('fs')
const obj = {name:"赵玉真"}
// 1、读取文件
fs.readFile('./09-data.json', (err, data) => {
// 2、读取失败
if(err) return console.log('读取失败');
// 3.读取成功 把字符串转为数组
const arr = JSON.parse(data.toString())
// 4、追加一条数据带数组中 (内存中追加)
arr.push(obj)
// 5、 写入文件 注意参数2需要转字符串
fs.writeFile('./09-data.json', JSON.stringify(arr), err => {
// 写入成功或失败提示
if(err) return console.log('写入错误');
console.log('写入成功');
})
})
const fs = require('fs')
const obj = {name:"李寒衣",belong:"雪月城",designation: "雪月剑仙"}
// 1、读取文件
fs.readFile('./09-data.json', (err, data) => {
// 2、读取失败
if(err) return console.log('读取失败');
// 3.读取成功 把字符串转为数组
const arr = JSON.parse(data.toString())
// 4、追加一条数据带数组中 (内存中追加)
arr.push(obj)
// 5、 写入文件 注意参数2需要转字符串
fs.writeFile('./09-data.json', JSON.stringify(arr), err => {
// 写入成功或失败提示
if(err) return console.log('写入错误');
console.log('写入成功');
})
})
fs.writeFileSync同步写入内容
语法:fs.writeFileSync(path,data[, options])
特点:writeFile方法是覆盖式写入,后面的内容会将前面的内容覆盖
参数:
- path,被写入文件的路径(相对路径或绝对路径)
- data,要写入的内容,字符串格式
- options:写入文件的参数配置,默认是utf8编码
const fs = require('fs')
try {
fs.writeFileSync('./123.txt', '准备下班')
console.log('写入成功');
} catch (error) {
console.log('写入失败')
}
少用
异步读取文件处理错误
(err,data)=>{ } 中有两个参数
参数1:err代表读取文件出错后的错误对象
参数2:data代表读取文件成功后的内容,如果读取失败则data的值为为undefined
err参数特点:
如果文件读取成功则err为null,
如果读取失败则err存储的具体的错误信息对象
通过如下if判断来处理错误
练习小案例
fs模块读写文件
const fs = require('fs')
const obj = {name:"司马长空",belong:"雪月城",designation: "枪仙"}
// 1、读取文件
fs.readFile('./09-data.json', (err, data) => {
// 2、读取失败
if(err) return console.log('读取失败');
// 3.读取成功 把字符串转为数组
const arr = JSON.parse(data.toString())
// 4、追加一条数据带数组中 (内存中追加)
arr.push(obj)
// 5、 写入文件 注意参数2需要转字符串
fs.writeFile('./09-data.json', JSON.stringify(arr), err => {
// 写入成功或失败提示
if(err) return console.log('写入错误');
console.log('写入成功');
})
})
图片复制案例
const fs = require('fs')
// 读取图片
fs.readFile('./太阳系.jpg', (err, data) => {
if (err) return console.log('写入失败');
// 读取成功
if (data) {
// 读取成功同步写入空的jpg文件 复制
fs.writeFileSync('./空.jpg', data)
console.log('写入成功');
}
})
附:fs模块中的常用方法
API | 作用 | 备注 |
---|---|---|
fs.access(path, callback) | 判断路径是否存在 | |
fs.appendFile(file, data, callback) | 向文件中追加内容 | |
fs.copyFile(src, callback) | 复制文件 | |
fs.mkdir(path, callback) | 创建目录 | |
fs.readDir(path, callback) | 读取目录列表 | |
fs.rename(oldPath, newPath, callback) | 重命名文件/目录 | |
fs.rmdir(path, callback) | 删除目录 | 只能删除空目录 |
fs.stat(path, callback) | 获取文件/目录信息 | |
fs.unlink(path, callback) | 删除文件 | |
fs.watch(filename[, options][, listener]) | 监视文件/目录 | |
fs.watchFile(filename[, options], listener) | 监视文件 | |
fs.existsSync(absolutePath) | 判断路径是否存在 |