初识Node.js
Node.js基本安装及使用
1.Node.js 的定义
Node.js 是一个基于 Chrome V8 引擎 的 JavaScript 运行时环境
名词解释
-
chrome V8引擎: 在chrome浏览器用来解析和执行js代码的工具;
-
运行时:理解为一个容器,用来运行代码的环境;这个环境让JS有读写文件,操作数据库,开启web服务器等能力
-
注意:Node.js 只是JS的服务端运行环境,不是一门语言(不需要学习新语言),而只需要学习它里面新的Api
2.Node.js作用
2.1前端运行环境
浏览器是JS的前端运行环境(开发网站)
2.2后端运行环境
Node.js是JS的后端运行环境(开发小程序、桌面应用、原生App、后端开发)
2.3Node.js环境与浏览器环境的区别
- 在浏览器端:js由三部分组成:ECMAScript + BOM + DOM
- 在NoeJS端:由ECMAScript + 内置模块(fs, http, path等) + 第三方模块(别人开发的模块)
- 注意:NodeJS中没有DOM,也没有BOM,也没有window对象。
- 浏览器是JS的前端运行环境,Node.js是JS的后端运行环境
我们学Node.js的 内置模块 自定义模块 第三方模块 以及学习npm工具来安装,卸载第三方包,为后面学习Vue等框架打下基础
3.下载和安装Node.js环境
3.1官方网站
中文网
建议下载长期维护版
注意:
-
win10 可以随意安装任何版本的Node
-
但是win7只能安装12及其以下的版本Node
3.2安装
点击下载到的安装包,一路下一步默认安装
注意:
- 不能安装到中文目录如d:/软件(完整的路径中都不能出现中文,否则在后续的使用中会出现影响),建议一直点击next即可
- 安装完成之后, 它不会在桌面出现快捷图标
3.3验证是否安装成功
打开终端(命名行):在任意地方使用win+r
再输入cmd
在终端输入node -v
进行查看安装的版本,如果没显示就表示没安装成功,请重新再试.
3.4命令行终端的打开方式
因为使用node.js就必须使用终端来运行,这里完善一下打开命令行终端的集中方式
小黑窗:是我们给 命令行工具 起的一个昵称
window系统打开小黑窗的几种方式
-
按 windows + R 运行窗口中输入cmd 回车即可打开
-
在任意目录的最上方路径输入框中输入 cmd 回车接口打开 (推荐)
-
在任意目录中按住 shift键 + 鼠标右键后在弹出菜单中点击 在此处打开命令窗口 或 在此处打开PowerShell窗口即可打开
- 在VSCode中,任意一个js文件上鼠标右键,选择在 集成终端中打开
苹果电脑操作:
jingyan.baidu.com/article/375…
4.在Node环境下运行js代码
场景:vscode中新建一个01nodejs执行体验.js,console.log()输出一段文本, 利用node执行后看到输出表示执行成功
步骤
- 新建01nodejs执行体验.js
- 编写代码:console.log('nodejs执行输出啦');
- 打开小黑窗,输入 node 01nodejs执行体验.js 回车看结果
注意:node后面要加空格,格式: node 空格 要执行的js文件
5.在Node环境下运行各种js语法
步骤
- 新建02node执行各种js语法.js
- 在文件中定义 let obj ={age:20}; let arr = [1,2,3]; node执行后打印obj和arr看看结果(能正常执行)
- 在文件中编写 if(1==1) {} else {} node执行后打印结果(能正常执行)
- 在文件中编写 alert(1)node执行时时会报错(alert is not defined)表示node环境中没有window不能操作dom
- 在文件中编写 while(true){console.log(1);}node执行后会一直打印1,此时该如何停止呢?在小黑窗中按 ctrl + c 终止
6.学习常用的命令及按键
命令及键盘按键
复制和粘贴
- 在小黑窗中复制内容:选中内容,再点鼠标右键
- 把粘贴板中的内容复制到小黑窗: 直接在小黑窗点鼠标右键
核心模块-文件读写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模块
console.log(fs);
fs.readFile异步读取文件内容
同步与异步的概念理解
同步
- 多个功能按先后顺序执行,后面任务等待前面任务执行完毕后才会执行。
- 如平常大家讨论问题时说:让我说完,意思是说我说完你再说。
优缺点:如果前面任务执行太久会阻止后面任务的执行,降低程序执行性能,造成用户体验差,优点是编程方式简单,便于理解执行过程。
异步
- 和同步相反,也就是在发出一个功能调用时,不管没有没得到结果,都继续往下执行。
- 就像两个人吵架一样,各说各的,不管对方有没有说完。
- 异步的表现形式:以一个回调函数的方式来实现异步任务的执行
优缺点:不会造成阻塞,提升了程序执行性能,用户体验好,缺点是编程方式复杂,执行过程理解难度较大,会形成回调函数的嵌套。
fs.readFile异步读取文件基本写法
语法
fs.readFile(path[, options], callback)
参数
path,读取文件的路径(相对路径或绝对路径) options:读取文件的参数配置,通常用一个utf8字符串表示即可 callback:读取完毕的回调函数(err,data)=>{}
步骤
-
在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二进制内容
异步代码
const fs = require('fs');
fs.readFile('./131.txt', (err, data) => {
// 如果代码正确 err会显示null
// 如果代码错误 data会显示 undefined
if (err) return console.log('文件读取错误');
console.log('data', data);
})
const fs = require('fs');
console.log(111);
fs.readFile('./1.txt', (data, err) => {
// if (err) return console.log(('文件读取错误'));\
console.log(22);
})
fs.readFile('./1.png', (data, err) => {
if (err) return console.log("文件读取失败");
})
// 异步读取的时候,会根据文件的大小来打印,不是根据位置
fs.readFileSync同步读取文件内容
语法
let res = fs.readFileSync(path[, options])
参数
- path,读取文件的路径(相对路径或绝对路径)
- options:读取文件的参数配置,通常用一个utf8字符串表示即可
步骤
- 在day01文件夹下 创建 /同步读取文件/rd.js 和 /同步读取文件/1.txt两个文件
- 在1.txt中随便输入一个字符串内容
- 在rd.js中导入fs核心模块 const fs = require(‘fs’)
- let res = fs.readFileSync(‘./1.txt’,’utf8’)读取到内容后直接返回,所以使用变量保存之
- 进入同步读取文件目录打开小黑窗,执行 node rd.js 看结果
注意:读取文本内容文件时,utf8参数要加上,不然打印出来的是一个Buffer二进制内容
代码展示
const fs = require('fs'); //导入
// readFileSync 同步读取 会按照写入的顺序输出
const data = fs.readFileSync('./1.txt')
console.log(data.toString());
trycatch 捕获错误
const fs = require('fs')
// 同步 按照书写的顺序执行,一旦发现错误就不在接着往下执行
// console.log(111);
// const data = fs.readFileSync('./1.txt')
// console.log(data.toString());
// console.log(222);
// trycatch 捕获错误
try { //存放正常业务代码
console.log(111);
const data = fs.readFileSync('./11.txt')
console.log(data.toString());
console.log(222);
} catch (error) {
console.log('读取文件失败'); //业务代码运行出现错误就会执行这个代码 取代之前出现的一长串字符 更加清晰
}
fs核心模块写入文件
fs.writeFile异步写入内容
写入方法
语法
fs.writeFile(path,data[, options], callback)
fs.writeFile(路径,写入的数据(字符串格式)[, options], err=>{
执行的语句
})
特点
writeFile方法是覆盖式写入,后面的内容会将前面的内容覆盖
参数
- path,被写入文件的路径(相对路径或绝对路径)
- data,要写入的内容,字符串格式
- options:写入文件的参数配置,默认是utf8编码
- callback:写入完毕的回调函数(err)=>{}
步骤
- 在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('./1.txt', '这是一首简单的小情歌 hello', err => {
if (err) return console.log('文件写入失败');
console.log('文件写入成功');
})
// 注意事项
// 1.覆盖写入 (会完全覆盖之前写入的信息)
// 2.如果文件不存在,会尝试自动创建文件 (除非路径完全不存在才会报错)
异步写入数组格式数据
const fs = require('fs'); //导入fs模块
const arr = [{ 'id': 1 }, { 'name': '张三' }] //设置data数据
fs.writeFile('./3.txt', JSON.stringify(arr), err => {
if (err) return console.log('文件写入失败');
console.log('文件写入成功');
})
课堂练习
读写文件:输入新的数据,添加到原来的数据上
const fs = require('fs');
const { json } = require('stream/consumers');
// 写入的数据
const obj = { "name": '老虎' }
// 读取文件
fs.readFile('./db/data.json', (err, data) => {
// fs.readFile('./db/data.json', (data, err) => {
if (err) return console.log('文件读取失败');
// console.log(data.toString());
// 将字符串转换成数组
const arr = JSON.parse(data.toString());
arr.push(obj)
// 写入文件
fs.writeFile('./db/data.json', JSON.stringify(arr), err => { //将数组转化成字符串格式
if (err) return console.log('文件写入失败');
console.log('文件写入成功');
})
})
// 注意事项:
// 1.读取文件的时候,数据类型为字符串 需要转换为数组才可以添加数据 json.parse()
// 2.写入文件 需要将数据类型转换成 字符串 json.stringify()
fs.writeFileSync同步写入内容(不太推荐 没有返回值 不好判断写入的状态)
写入方法
语法
fs.writeFileSync(path,data[, options])
特点
writeFile方法是覆盖式写入,后面的内容会将前面的内容覆盖
参数
- path,被写入文件的路径(相对路径或绝对路径)
- data,要写入的内容,字符串格式
- options:写入文件的参数配置,默认是utf8编码
步骤
- 在day01文件夹下 创建 /同步覆盖式写入文件/wd.js 和 /同步覆盖式写入文件/1.txt两个文件
- 在wd.js中导入fs核心模块 const fs = require(‘fs’)
- fs.writeFileSync(‘./1.txt’,’白日依山尽’,’utf8’ })
- 进入同步覆盖式写入文件目录打开小黑窗,执行 node wd.js 看结果
注意:同步写入方法返回值为:undefined
代码展示
const fs = require('fs')
fs.writeFileSync('./db/data.json', '{"name":"糊糊"}')
//没有返回值 不好判断输入的数据是否符合要求
// 需要借助trycatch(){}
try {
fs.writeFileSync('./db/data.json', '{"name":"诸葛"}')
console.log('输入成功');
} catch (error) {
console.log("输入失败");
}
fs模块总结
1.代码
异步读取文件: fs.readFile(path,utf8编码,回调函数)
同步读取文件:fs.readFileSync(path,utf8编码)
异步写入内容:fs.writeFile(path,content,utf8,回调函数)
同步写入内容:fs.writeFileSync(path,content,utf8)
2.回调函数
readFile的回调函数:(err,data)=>{}
readFileSync没有回调函数,结果直接返回
writeFile的回调函数(err)=>{}
writeFileSync没有回调函数,结果返回undefined
3.处理方法
- 读写异步方法错误处理,由方法本身捕获并通过回调函数第1个参数传给编码者
- 同步方法需要编码者使用 **try{}catch(err){}**主动捕获错误
练习
1.练习1
代码展示
const fs = require('fs');
// 读文件
const data1 = [{ "name": "后羿", "skinname": "精灵王" }]
fs.writeFile('./db/data1.json', JSON.stringify(data1), err => {
if (err) return console.log('文件输入失败');
console.log('输入文件正确');
})
// 追加对象到文件中
fs.readFile('./db/data1.json', (err, data) => {
if (err) return console.log('文件读取失败');
console.log("文件读取成功");
// console.log(typeof data.toString());
const arr = JSON.parse(data.toString()) //将数据转成数组格式
const data2 = { "name": "程咬金", "skinname": "功夫畜生" } //追加数据
arr.push(data2)
// 追加对象输入
fs.writeFile('./db/data1.json', JSON.stringify(arr), err => {
if (err) return console.log('输入文件失败');
console.log("输入成功");
})
fs.readFile('./db/data1.json', (arr, data) => {
if (err) return console.log("读取失败");
console.log(data.toString());
})
})
2.练习2
代码展示
// 将3.txt的内容 拷贝到 4.txt
// 实现步骤: 先读取3.txt的内容
// 再使用fs将读取到的内容写入到 4.txt 中
const fs = require('fs');
fs.readFile('./db/3.txt', (err, data) => {
if (err) return console.log("文件读取失败");
console.log("文件读取成功");
const str = data
fs.writeFile('./db/4.txt', str, err => {
if (err) return console.log("文件写入失败");
console.log("文件写入成功");
})
})