Day01: 初识Nodejs
- 知道nodejs是一个js运行环境,借助各种模块,它可以读写文件,处理路径...
目标
- 掌握Node.js的基本概念;
- 了解Node.js在前端和后端领域中的作用
导入
Node.js是什么
官方概念:Node.js® 是一个基于 Chrome V8 引擎 的 JavaScript 运行时
(Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.)
上面的概念中有两个特殊的名词,解释如下:
- chrome V8引擎: chrome浏览器用来解析和执行js代码的工具;
- 运行时:理解为一个容器,用来运行代码的环境;
所以,对Node.js更通俗的解释是:一个用chrome浏览器V8引擎来跑JS代码的环境。
图示如下:
- 浏览器是javascript的前端运行环境;
- Node.js是javascript的后端运行环境;
Nodejs的理解
- Node全名是Node.js(也叫Node, nodejs, node.js),但它不是一个js文件,而是一个软件
- Node.js是一个基于Chrome V8引擎的javascript的运行环境,在这个环境中可以执行js代码
- Node.js提供了大量的内置模块及丰富的第三方模块,能够让我们完成文件读写、Web服务器、操作数据库等功能
Node.js的意义和学习内容
学习Node.js的意义
- 在Node环境下,写js代码实现后端的功能(web服务器,写接口,读写数据库.....)
- 了解后端程序员的工作,增加职场竞争力
- 它是前端框架(vue, react,angular)的运行基础,学好Node.js有助于为后续框架的学习打下基础
Node.js的学习内容
它只是一个环境,不是一门语言(不需要学习新语言
),我们要学习它的两个内容: 模块系统, npm包管理工具。
模块系统
。能用不同的模块来完成不同的功能,例如:创建web服务器,写接口,连接操作数据库
NPM包管理工具
。通过npm来管理我们的需要的第三方包,为后续学习框架打下基础
下装安装nodejs
下载
进入官网
点击左侧的按钮(有LTS标识的那个),会立即下载。
版本说明
- LTS: 长期稳定版(Long Term Support))。 项目开发建议使用长期稳定版
- Current: 最新版。最新版包含了一些新功能,如果想学习最新的功能,则可以使用该版本。最新版可能会有一些未知的bug。
安装
找到你下载的安装包,(不同系统选择对应的安装文件)
双击安装文件开始安装,傻瓜式安装,一路 next
即可
注意:
- 建议安装目录所使用
英文路径
(不要安装在类似于 d:/软件/node) - 安装完成之后, 它
不会
在桌面出现快捷图标,没法双击打开
测试是否安装成功
打开任意一个小黑窗,输入node -v
能够看到Nodejs版本号即为安装成功。
小结
去官网自行下载LTS版本;
安装完成之后,页面没有图标按钮;
上班之后,要问同事,具体的node版本是什么;
打开小黒窗的4种方式
打开小黒窗的方式,如下
在window系统中
方法1:cmd窗口(window+R, --->运行-->录入cmd,回车)
方法2:在资源管理器中,打开任意目录,直接在地址栏中写入 cmd
,并回车
方法3:powershell(window10操作系统)
在资源管理器中按下shift,同时点击鼠标右键,可以选择在此处打开powershell/命令行窗口。
方法4: vscode中的右键,在命令行中运行
苹果电脑操作:
参考1:https://jingyan.baidu.com/article/375c8e1969b5f065f3a22967.html
参考3:在 Mac 上的“终端”中执行命令和运行工具 - Apple 支持 (中国)
在Node环境下运行js代码
我们前面的学习中,js代码都是在浏览器中运行的,现在开始学习nodejs后,我们有了第二个环境中可以运行js代码。下面来学习如何在nodejs下运行js代码。
目标
掌握在NodeJS环境下运行js代码的步骤
步骤
- 准备js文件。准备好要被执行的js文件
- 写命令来运行
格式node 文件目录.js
。在命令行工具中写命令来运行这个文件
实操
准备一个JS文件
请事先准备好一个js文件。例设这里的路径是:d:/src/index.js
具体内容是
let a = 1; console.info(a + 2);
运行这个文件
打开命令行工具(请注意当前所处的位置),输入命令
格式: node 要执行的文件的路径
注意:node 的后面有一个空格
示例
node index.js node 01.js # 01.js就是当前目录下 node a/01.js # 01.js在目录a下面
Tip:
最好是在.js文件所在目录下来运行这个js文件
小结
nodejs就是一个环境,可以跑js代码
拓展:常用的命令行下的命令及按键
考虑到后面一段时间我们将会与这个小黒窗打交道,大家可以练习一下
命令及键盘按键
node 空格 某个js文件 # 调用 node 程序,运行某个js文件 clear 或者 cls # 清空界面 ls/dir # 查看列表(list) cd 目录名 # 进入到目录中去 cd .. # 返回上一级目录 cd \ # 直接回到根目录 Ctrl+C # 停止 Node 程序 输入部分文件名后按下 Tab 键 // 补全文件名 或 目录名, 多次tab会进行切换 ↑ ↓ 上下箭头 # 切换历史输入
复制粘贴
在小黑窗中复制内容:选中内容,再点鼠标右键
把粘贴板中的内容复制到小黑窗: 点鼠标右键
Node.js和浏览器端的区别
通过前面的学习,我们知道了有两个运行js代码的环境,那他们有什么区别呢?
在浏览器端
js由三部分组成:ECMAScript + BOM + DOM
es6 就是ECMAScript 6.0的简写,也泛指其之后的所有版本
ECMAScript是一种由Ecma国际(前身为欧洲计算机制造商协会,European Computer Manufacturers Association)通过ECMA-262标准化的脚本程序设计语言。是javascript语言的一个标准。它约定了:如何定义变量,函数,运算,数组,内置对象等等。
在nodejs端
有ECMAScript + 内置模块(fs, http, path,.....)。在nodejs中是没有BOM、DOM、window,但使用ECMAScript是通用的
NodeJS中没有DOM,也没有BOM,也没有window对象。
异同点
相同点:
- 都是可以运行js代码的容器,更严格一点说:都可以运行ECMAScript
- 要下载安装才能使用
不同点:
Day01: 初识Nodejs
- 知道nodejs是一个js运行环境,借助各种模块,它可以读写文件,处理路径...
目标
- 掌握Node.js的基本概念;
- 了解Node.js在前端和后端领域中的作用
Node.js是什么
导入
大家刚结束了大事件项目,有几个小问题来互动一下:
提问
:在项目中,我们作为前端程序员实现做什么事? 这些事需要后端同学配合吗?
提问
:前端要学什么编程语言?后端会用什么编程语言?
提问
:可以用js语言实现后端的功能吗?
Node.js是什么
官方概念:Node.js® 是一个基于 Chrome V8 引擎 的 JavaScript 运行时
(Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.)
上面的概念中有两个特殊的名词,解释如下:
- chrome V8引擎: chrome浏览器用来解析和执行js代码的工具;
- 运行时:理解为一个容器,用来运行代码的环境;
所以,对Node.js更通俗的解释是:一个用chrome浏览器V8引擎来跑JS代码的环境。
图示如下:
- 浏览器是javascript的前端运行环境;
- Node.js是javascript的后端运行环境;
Nodejs的理解
- Node全名是Node.js(也叫Node, nodejs, node.js),但它不是一个js文件,而是一个软件
- Node.js是一个基于Chrome V8引擎的javascript的运行环境,在这个环境中可以执行js代码
- Node.js提供了大量的内置模块及丰富的第三方模块,能够让我们完成文件读写、Web服务器、操作数据库等功能
Node.js的意义和学习内容
学习Node.js的意义
- 在Node环境下,写js代码实现后端的功能(web服务器,写接口,读写数据库.....)
- 了解后端程序员的工作,增加职场竞争力
- 它是前端框架(vue, react,angular)的运行基础,学好Node.js有助于为后续框架的学习打下基础
Node.js的学习内容
它只是一个环境,不是一门语言(不需要学习新语言
),我们要学习它的两个内容: 模块系统, npm包管理工具。
模块系统
。能用不同的模块来完成不同的功能,例如:创建web服务器,写接口,连接操作数据库
NPM包管理工具
。通过npm来管理我们的需要的第三方包,为后续学习框架打下基础
下装安装nodejs
下载
进入官网
点击左侧的按钮(有LTS标识的那个),会立即下载。
版本说明
- LTS: 长期稳定版(Long Term Support))。 项目开发建议使用长期稳定版
- Current: 最新版。最新版包含了一些新功能,如果想学习最新的功能,则可以使用该版本。最新版可能会有一些未知的bug。
安装
找到你下载的安装包,(不同系统选择对应的安装文件)
双击安装文件开始安装,傻瓜式安装,一路 next
即可
注意:
- 建议安装目录所使用
英文路径
(不要安装在类似于 d:/软件/node) - 安装完成之后, 它
不会
在桌面出现快捷图标,没法双击打开
测试是否安装成功
打开任意一个小黑窗,输入node -v
能够看到Nodejs版本号即为安装成功。
小结
去官网自行下载LTS版本;
安装完成之后,页面没有图标按钮;
上班之后,要问同事,具体的node版本是什么;
打开小黒窗的4种方式
打开小黒窗的方式,如下
在window系统中
方法1:cmd窗口(window+R, --->运行-->录入cmd,回车)
方法2:在资源管理器中,打开任意目录,直接在地址栏中写入 cmd
,并回车
方法3:powershell(window10操作系统)
在资源管理器中按下shift,同时点击鼠标右键,可以选择在此处打开powershell/命令行窗口。
方法4: vscode中的右键,在命令行中运行
苹果电脑操作:
参考1:https://jingyan.baidu.com/article/375c8e1969b5f065f3a22967.html
参考3:在 Mac 上的“终端”中执行命令和运行工具 - Apple 支持 (中国)
在Node环境下运行js代码
我们前面的学习中,js代码都是在浏览器中运行的,现在开始学习nodejs后,我们有了第二个环境中可以运行js代码。下面来学习如何在nodejs下运行js代码。
目标
掌握在NodeJS环境下运行js代码的步骤
步骤
- 准备js文件。准备好要被执行的js文件
- 写命令来运行
格式node 文件目录.js
。在命令行工具中写命令来运行这个文件
实操
准备一个JS文件
请事先准备好一个js文件。例设这里的路径是:d:/src/index.js
具体内容是
let a = 1; console.info(a + 2);
运行这个文件
打开命令行工具(请注意当前所处的位置),输入命令
格式: node 要执行的文件的路径
注意:node 的后面有一个空格
示例
node index.js node 01.js # 01.js就是当前目录下 node a/01.js # 01.js在目录a下面
Tip:
最好是在.js文件所在目录下来运行这个js文件
小结
nodejs就是一个环境,可以跑js代码
拓展:常用的命令行下的命令及按键
考虑到后面一段时间我们将会与这个小黒窗打交道,大家可以练习一下
命令及键盘按键
node 空格 某个js文件 # 调用 node 程序,运行某个js文件 clear 或者 cls # 清空界面 ls/dir # 查看列表(list) cd 目录名 # 进入到目录中去 cd .. # 返回上一级目录 cd \ # 直接回到根目录 Ctrl+C # 停止 Node 程序 输入部分文件名后按下 Tab 键 // 补全文件名 或 目录名, 多次tab会进行切换 ↑ ↓ 上下箭头 # 切换历史输入
复制粘贴
在小黑窗中复制内容:选中内容,再点鼠标右键
把粘贴板中的内容复制到小黑窗: 点鼠标右键
Node.js和浏览器端的区别
通过前面的学习,我们知道了有两个运行js代码的环境,那他们有什么区别呢?
在浏览器端
js由三部分组成:ECMAScript + BOM + DOM
es6 就是ECMAScript 6.0的简写,也泛指其之后的所有版本
ECMAScript是一种由Ecma国际(前身为欧洲计算机制造商协会,European Computer Manufacturers Association)通过ECMA-262标准化的脚本程序设计语言。是javascript语言的一个标准。它约定了:如何定义变量,函数,运算,数组,内置对象等等。
在nodejs端
有ECMAScript + 内置模块(fs, http, path,.....)。在nodejs中是没有BOM、DOM、window,但使用ECMAScript是通用的
NodeJS中没有DOM,也没有BOM,也没有window对象。
区别
相同点:
- 都是可以运行js代码的容器,更严格一点说:都可以运行ECMAScript
- 要下载安装才能使用
不同点:
- 各有不同的API: nodejs运行js时,不能写DOM,BOM,也不能用window对象了
- Nodejs 环境可以去实现后端的功能
- 浏览器环境可以去实现前端的功能
nodejs中的模块分类
每个模块都是一个独立的文件。每个模块都可以完成特定的功能,我们需要时就去引入它们,并调用。
nodejs模块的分类:
- 核心模块
-
- 就是nodejs自带的模块,在安装完nodejs之后,就可以任意使用
- 相当于学习js时使用的Array对象
- 源代码 node/lib at master · nodejs/node · GitHub
- 自定义模块
-
- 程序员自己写的模块
- 相当于我们在学习js时的自定义函数。
- 第三方模块
-
- 其他程序员写好的模块。nodejs生态提供了一个专门的工具npm来管理第三方模块,后面我们会专门讲到。
- 相当于别人写好的函数或者库。例如我们前面学习的axios, JQuery库,artTemplate等。
核心模块fs
目标
通过学习核心模块fs,掌握核心模块的基本使用方法
fs模块的文件
文档
学会查 API,远远比会几个 API 更重要
理解核心模块
- 核心模块就是 Node 内置的模块,需要通过唯一的标识名称来进行获取。
- 每一个核心模块基本上都是暴露了一个对象,里面包含一些方法供我们使用。
- 一般在加载核心模块的时候,变量(或常量)的起名最好就和核心模块的标识名同名。
- 例如:
const fs = require('fs')
,const path = require('path')
const path = require('path') console.log(path)
fs模块
fs模块(fs是 FileSystem的简写)是Node.js用来进行文件操作的模块,它属于核心模块。你引入之后就可以直接使用了。
核心模块的使用步骤:
- 引入模块
// 引入模块 const fs = require('fs'); // 可以使用var、let,但是建议使用const,因为我们不希望它被改变。 // 名字不必大写成FS,一般也就叫fs这个名字。
- 调用api实现自己的要求
fs.各种API(实参)
小结
- 核心模块的功能是nodejs提供的,具体要看文档;
- 使用步骤
-
- 引入。 const xxx = require('xxx')
-
-
- console.log(xx)
-
-
- 使用。
fs-readFileSync-文件读取
格式
const fs = require("fs") let rs = fs.readFileSync('文件路径',"utf8") // rs 就是读出来的内容 console.log(rs)
注意:api的名字结尾有Sync(async是异步的,sync表示同步的)
捕获同步格式中的错误对象
如果读成功,则会获取读出来的数据,如果失败了,则会中断后续所有的代码执行。
console.log(1) let res = fs.readFileSync('errorPath.js') console.log(res) console.log(2) // 这句代码是不会执行的
解决方案:用try. catch 结构
// try catch // try { // 可能会有错误的代码 // } catch(err){ // 如果try内的代码有错误,就会进入catch,并把错误传进来 // }
try { const fs = require("fs") let rs = fs.readFileSync('文件路径',"utf8"); console.log(rs) } catch(err) { console.log(err) }
fs-writeFileSync-文件写入
目标
掌握writeFileSync的使用
writeFileSync
功能:向指定文件中写入字符串, 如果没有该文件则尝试创建该文件。
格式:
fs.writeFileSync(pathName, content, option); // 参数1: 要写入的文件路径 --- 相对路径和绝对路径均可,推荐使用绝对路径 // 参数2: 要写入文件的内容 // 参数3: 配置项,设置写入的字符集,默认utf-8
注意:它是覆盖写入,会把文件中的内容全部删除,再填入新的内容。
示例1: 写入.txt文件
任务:写入约定文本内容
const fs = require('fs') fs.writeFileSync('./a.txt', 'hello world! \n 换一行')
示例2: 写入JSON数据
稍微把问题提升一下,问: 如何把数据写入文件中?
const fs = require('fs') const data = [{name: '小王', age: 20}] fs.writeFileSync('./a.txt', data)
上面的写法会出错: data不是一个字符串或者是Buffer
解决方式: 调用JSON.stringify先对内容做处理,转成字符串,再保存
const fs = require('fs') const data = [{name: '小王', age: 20}] fs.writeFileSync('./a.txt', JSON.stringify(data))
路径问题-相对路径的隐患
在读取文件时,使用相对路径是容易出问题的
。下面我们来看会出什么问题。
素材准备
假设有如下两个文件,它们所处的目录及文件名如下所示:
pageA └── code ├── readFile.js # 用来读txt └── rs.txt # 文本文件,具体的内容没有影响
readFile.js用来读出rs.txt中的内容,并显示。它的代码是这样的:
// code/readFile.js const fs = require('fs'); fs.readfilesync("./rs.txt",'utf8'); //注意这里对fs.txt的访问使用的是相对"readFile.js" 本身的路径
由于readFiles.js和要读取的目标rs.txt是在同级目录下,所以可以写相对路径。
运行代码
想要运行readFile.js这个文件有多种方式,根据当前处在的位置不同:
- A方案:如果终端中的路径定位在
pageA/code
目录下,则通过node readFile.js
就可以运行 - B方案:如果终端中的路径定位在
pageA
目录下,通过:node code/readFile.js
能成功执行.js文件,但是却找不到.txt文件的路径了。
原因分析
我们在fs中读取文件时,由于使用的是相对路径,所以在读这个文件的时,nodejs会去:
运行命令的小黑窗的路径 + 代码中的相对路径
找它。
所以上述代码中:
- A方案在运行时,找到的文件是
pageA/code/rs.txt
,它可以找到文件 - B方案在运行时,找到的文件是
pageA/rs.txt
,它就找到不文件了
解决方法: 就是在操作文件时,使用绝对路径来定位文件。
路径问题-使用绝对路径
目标
掌握 __dirname
和 __filename
的用法,并能在操作文件路径时,正确使用它们
复习回顾绝对与相对路径
相对与路绝位置在前面的学习中也有涉及,例如a标签的 href ,img标签的src属性在设置值时都可以写相对或者绝对地址。
例如:
<a href="./index.html">主页-相对地址</a> <a href="https://www.baidu.com/index.html">主页-绝对路径</a>
在nodejs, 我们提到的相对/绝对路径理解如下:
- 绝对路径: 从磁盘根目录开始到指定文件的路径。
- 相对路径:是以某个文件的位置为起点,相对于这个位置来找另一个文件。
__dirname __filename 获取绝对路径
nodejs中提供了两个全局变量来获取获取绝对路径:
- __filename:获取当前被执行的文件的绝对路径
- __dirname:获取当前被执行的文件的文件夹所处的绝对路径
全局变量的含义是:
- 变量:它们的值是变化的。在不同的文件中值就不同,因为文件的路径也不同嘛。
- 全局:在任意地方都可以直接使用。
测试使用
在任意代码的任意位置
console.log(__dirname) console.log(__filename)
在文件操作时,使用绝对路径
只需要在读入文件时,在文件名的前面拼接上路径:
// 拼接html5.jpg的绝对路径 // 1) 找到当前文件夹的绝对路径 console.log(__dirname) // 2) 加上 html5.jpg const fs = require('fs') const filePath = __dirname + '\\rs.txt' // 走一步,看一步 console.log(filePath) const rs = fs.readFileSync(filePath)
path模块
作用
作用是用来处理路径问题:拼接,分析,取后缀名等等。
- 官网文档地址
- 是node中的核心模块之一
使用步骤
- 引入模块
const path = require('path')
- 使用模块
调用API即可
常用的api
- path.basename() :此方法返回
path
的最后一部分。一般可用来获取路径中的文件名。 - path.join() :路径拼接。
- path.parse(pathurl) :把一个路径转成一个对象
示例
path.basename('/foo/bar/baz/asdf/quux.html');// 返回: 'quux.html' path.basename('/foo/bar/baz/asdf/quux.html', '.html');// 返回: 'quux' path.dirname('/foo/bar/baz/asdf/quux');// 返回: '/foo/bar/baz/asdf' path.extname('index.html');// 返回: '.html'
注意:path模块并不考虑其中地址是否真的存在,只是单纯调用方法,获取结果。
使用path模块解决文件读写中的路径拼写
// 拼接html5.jpg的绝对路径 // 1) 找到当前文件夹的绝对路径 console.log(__dirname) // 2) 加上 html5.jpg const fs = require('fs') const path = require('path') const filePath = path.join(__dirname, 'html5.jpg') // const filePath = __dirname + '\\html5.jpg' // 走一步,看一步 console.log(filePath) fs.readFile(filePath,function(err, data) { if(err) { console.log(err) return } console.log(data) })
附:path模块常用方法列表
方法 | 作用 |
path.basename(path[, ext]) | 获取返回 path 的最后一部分(文件名) |
path.dirname(path) | 返回目录名 |
path.extname(path) | 返回路径中文件的扩展名(包含.) |
path.format(pathObject) | 将一个对象格式化为一个路径字符串 |
path.join([...paths]) | 拼接路径 |
path.parse(path) | 把路径字符串解析成对象的格式 |
path.resolve([...paths]) | 基于当前工作目录拼接路径 |
附: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) | 判断路径是否存在 |
小结
- nodejs 是什么?
-
- 是一个基于chrome v8引擎的javascript 运行时
- 它是不是一个新语言,它只是一个环境,用来运行js代码
- 与浏览器的区别在?
-
- nodejs中没有dom,bom, window, 只有 ECMAScript
- 我们学它是图什么?
-
- 它是用来写后端功能,帮助我们了解后端程序员是如何工作;
- 提升竞争力,会后端优先!
- 后边学习前端框架的基础
- 学什么?
-
- 模块系统(核心模块 fs, path,自定义模块,第三方模块)
- npm 操作
- fs: 用来做文件(文件夹)操作:读\写\删除\创建.......
- path: 做路径相关的操作 path.join()
- __dirname, __filename : 在nodejs中,表示全局变量。用来获取绝对路径。
-
- __dirname : 获取当前被执行的文件所在的文件夹的绝对路径
- __filename: 获取当前被执行的文件的绝对路径
作业
对json数据进行操作,要求
根目录 ├── db │ └── data.json # 这里有数据 └── yourfile.js # 操作db/data.json
文件data.json
的内容如下:
[{"name":"小王"},{"name":"小李"}]
文件yourfile.js
是需要写代码去完成功能: node yourfile.js
之后,会在data.json中添加一条记录,{"name":"小张"}
// 这里写你的代码 // ......
会在data.json中添加内容,添加之后的效果如下:
[{"name":"小王"},{"name":"小李"},{"name":"小张"}]
测试题
Day01: 初识Nodejs
- 知道nodejs是一个js运行环境,借助各种模块,它可以读写文件,处理路径...
目标
- 掌握Node.js的基本概念;
- 了解Node.js在前端和后端领域中的作用
Node.js是什么
导入
大家刚结束了大事件项目,有几个小问题来互动一下:
提问
:在项目中,我们作为前端程序员实现做什么事? 这些事需要后端同学配合吗?
提问
:前端要学什么编程语言?后端会用什么编程语言?
提问
:可以用js语言实现后端的功能吗?
Node.js是什么
官方概念:Node.js® 是一个基于 Chrome V8 引擎 的 JavaScript 运行时
(Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.)
上面的概念中有两个特殊的名词,解释如下:
- chrome V8引擎: chrome浏览器用来解析和执行js代码的工具;
- 运行时:理解为一个容器,用来运行代码的环境;
所以,对Node.js更通俗的解释是:一个用chrome浏览器V8引擎来跑JS代码的环境。
图示如下:
- 浏览器是javascript的前端运行环境;
- Node.js是javascript的后端运行环境;
Nodejs的理解
- Node全名是Node.js(也叫Node, nodejs, node.js),但它不是一个js文件,而是一个软件
- Node.js是一个基于Chrome V8引擎的javascript的运行环境,在这个环境中可以执行js代码
- Node.js提供了大量的内置模块及丰富的第三方模块,能够让我们完成文件读写、Web服务器、操作数据库等功能
Node.js的意义和学习内容
学习Node.js的意义
- 在Node环境下,写js代码实现后端的功能(web服务器,写接口,读写数据库.....)
- 了解后端程序员的工作,增加职场竞争力
- 它是前端框架(vue, react,angular)的运行基础,学好Node.js有助于为后续框架的学习打下基础
Node.js的学习内容
它只是一个环境,不是一门语言(不需要学习新语言
),我们要学习它的两个内容: 模块系统, npm包管理工具。
模块系统
。能用不同的模块来完成不同的功能,例如:创建web服务器,写接口,连接操作数据库
NPM包管理工具
。通过npm来管理我们的需要的第三方包,为后续学习框架打下基础
下装安装nodejs
下载
进入官网
点击左侧的按钮(有LTS标识的那个),会立即下载。
版本说明
- LTS: 长期稳定版(Long Term Support))。 项目开发建议使用长期稳定版
- Current: 最新版。最新版包含了一些新功能,如果想学习最新的功能,则可以使用该版本。最新版可能会有一些未知的bug。
安装
找到你下载的安装包,(不同系统选择对应的安装文件)
双击安装文件开始安装,傻瓜式安装,一路 next
即可
注意:
- 建议安装目录所使用
英文路径
(不要安装在类似于 d:/软件/node) - 安装完成之后, 它
不会
在桌面出现快捷图标,没法双击打开
测试是否安装成功
打开任意一个小黑窗,输入node -v
能够看到Nodejs版本号即为安装成功。
小结
去官网自行下载LTS版本;
安装完成之后,页面没有图标按钮;
上班之后,要问同事,具体的node版本是什么;
打开小黒窗的4种方式
打开小黒窗的方式,如下
在window系统中
方法1:cmd窗口(window+R, --->运行-->录入cmd,回车)
方法2:在资源管理器中,打开任意目录,直接在地址栏中写入 cmd
,并回车
方法3:powershell(window10操作系统)
在资源管理器中按下shift,同时点击鼠标右键,可以选择在此处打开powershell/命令行窗口。
方法4: vscode中的右键,在命令行中运行
苹果电脑操作:
参考1:https://jingyan.baidu.com/article/375c8e1969b5f065f3a22967.html
参考3:在 Mac 上的“终端”中执行命令和运行工具 - Apple 支持 (中国)
在Node环境下运行js代码
我们前面的学习中,js代码都是在浏览器中运行的,现在开始学习nodejs后,我们有了第二个环境中可以运行js代码。下面来学习如何在nodejs下运行js代码。
目标
掌握在NodeJS环境下运行js代码的步骤
步骤
- 准备js文件。准备好要被执行的js文件
- 写命令来运行
格式node 文件目录.js
。在命令行工具中写命令来运行这个文件
实操
准备一个JS文件
请事先准备好一个js文件。例设这里的路径是:d:/src/index.js
具体内容是
let a = 1; console.info(a + 2);
运行这个文件
打开命令行工具(请注意当前所处的位置),输入命令
格式: node 要执行的文件的路径
注意:node 的后面有一个空格
示例
node index.js node 01.js # 01.js就是当前目录下 node a/01.js # 01.js在目录a下面
Tip:
最好是在.js文件所在目录下来运行这个js文件
小结
nodejs就是一个环境,可以跑js代码
拓展:常用的命令行下的命令及按键
考虑到后面一段时间我们将会与这个小黒窗打交道,大家可以练习一下
命令及键盘按键
node 空格 某个js文件 # 调用 node 程序,运行某个js文件 clear 或者 cls # 清空界面 ls/dir # 查看列表(list) cd 目录名 # 进入到目录中去 cd .. # 返回上一级目录 cd \ # 直接回到根目录 Ctrl+C # 停止 Node 程序 输入部分文件名后按下 Tab 键 // 补全文件名 或 目录名, 多次tab会进行切换 ↑ ↓ 上下箭头 # 切换历史输入
复制粘贴
在小黑窗中复制内容:选中内容,再点鼠标右键
把粘贴板中的内容复制到小黑窗: 点鼠标右键
Node.js和浏览器端的区别
通过前面的学习,我们知道了有两个运行js代码的环境,那他们有什么区别呢?
在浏览器端
js由三部分组成:ECMAScript + BOM + DOM
es6 就是ECMAScript 6.0的简写,也泛指其之后的所有版本
ECMAScript是一种由Ecma国际(前身为欧洲计算机制造商协会,European Computer Manufacturers Association)通过ECMA-262标准化的脚本程序设计语言。是javascript语言的一个标准。它约定了:如何定义变量,函数,运算,数组,内置对象等等。
在nodejs端
有ECMAScript + 内置模块(fs, http, path,.....)。在nodejs中是没有BOM、DOM、window,但使用ECMAScript是通用的
NodeJS中没有DOM,也没有BOM,也没有window对象。
区别
相同点:
- 都是可以运行js代码的容器,更严格一点说:都可以运行ECMAScript
- 要下载安装才能使用
不同点:
- 各有不同的API: nodejs运行js时,不能写DOM,BOM,也不能用window对象了
- Nodejs 环境可以去实现后端的功能
- 浏览器环境可以去实现前端的功能
nodejs中的模块分类
每个模块都是一个独立的文件。每个模块都可以完成特定的功能,我们需要时就去引入它们,并调用。
nodejs模块的分类:
- 核心模块
-
- 就是nodejs自带的模块,在安装完nodejs之后,就可以任意使用
- 相当于学习js时使用的Array对象
- 源代码 node/lib at master · nodejs/node · GitHub
- 自定义模块
-
- 程序员自己写的模块
- 相当于我们在学习js时的自定义函数。
- 第三方模块
-
- 其他程序员写好的模块。nodejs生态提供了一个专门的工具npm来管理第三方模块,后面我们会专门讲到。
- 相当于别人写好的函数或者库。例如我们前面学习的axios, JQuery库,artTemplate等。
核心模块fs
目标
通过学习核心模块fs,掌握核心模块的基本使用方法
fs模块的文件
文档
学会查 API,远远比会几个 API 更重要
理解核心模块
- 核心模块就是 Node 内置的模块,需要通过唯一的标识名称来进行获取。
- 每一个核心模块基本上都是暴露了一个对象,里面包含一些方法供我们使用。
- 一般在加载核心模块的时候,变量(或常量)的起名最好就和核心模块的标识名同名。
- 例如:
const fs = require('fs')
,const path = require('path')
const path = require('path') console.log(path)
fs模块
fs模块(fs是 FileSystem的简写)是Node.js用来进行文件操作的模块,它属于核心模块。你引入之后就可以直接使用了。
核心模块的使用步骤:
- 引入模块
// 引入模块 const fs = require('fs'); // 可以使用var、let,但是建议使用const,因为我们不希望它被改变。 // 名字不必大写成FS,一般也就叫fs这个名字。
- 调用api实现自己的要求
fs.各种API(实参)
小结
- 核心模块的功能是nodejs提供的,具体要看文档;
- 使用步骤
-
- 引入。 const xxx = require('xxx')
-
-
- console.log(xx)
-
-
- 使用。
fs-readFileSync-文件读取
格式
const fs = require("fs") let rs = fs.readFileSync('文件路径',"utf8") // rs 就是读出来的内容 console.log(rs)
注意:api的名字结尾有Sync(async是异步的,sync表示同步的)
捕获同步格式中的错误对象
如果读成功,则会获取读出来的数据,如果失败了,则会中断后续所有的代码执行。
console.log(1) let res = fs.readFileSync('errorPath.js') console.log(res) console.log(2) // 这句代码是不会执行的
解决方案:用try. catch 结构
// try catch // try { // 可能会有错误的代码 // } catch(err){ // 如果try内的代码有错误,就会进入catch,并把错误传进来 // }
try { const fs = require("fs") let rs = fs.readFileSync('文件路径',"utf8"); console.log(rs) } catch(err) { console.log(err) }
fs-writeFileSync-文件写入
目标
掌握writeFileSync的使用
writeFileSync
功能:向指定文件中写入字符串, 如果没有该文件则尝试创建该文件。
格式:
fs.writeFileSync(pathName, content, option); // 参数1: 要写入的文件路径 --- 相对路径和绝对路径均可,推荐使用绝对路径 // 参数2: 要写入文件的内容 // 参数3: 配置项,设置写入的字符集,默认utf-8
注意:它是覆盖写入,会把文件中的内容全部删除,再填入新的内容。
示例1: 写入.txt文件
任务:写入约定文本内容
const fs = require('fs') fs.writeFileSync('./a.txt', 'hello world! \n 换一行')
示例2: 写入JSON数据
稍微把问题提升一下,问: 如何把数据写入文件中?
const fs = require('fs') const data = [{name: '小王', age: 20}] fs.writeFileSync('./a.txt', data)
上面的写法会出错: data不是一个字符串或者是Buffer
解决方式: 调用JSON.stringify先对内容做处理,转成字符串,再保存
const fs = require('fs') const data = [{name: '小王', age: 20}] fs.writeFileSync('./a.txt', JSON.stringify(data))
路径问题-相对路径的隐患
在读取文件时,使用相对路径是容易出问题的
。下面我们来看会出什么问题。
素材准备
假设有如下两个文件,它们所处的目录及文件名如下所示:
pageA └── code ├── readFile.js # 用来读txt └── rs.txt # 文本文件,具体的内容没有影响
readFile.js用来读出rs.txt中的内容,并显示。它的代码是这样的:
// code/readFile.js const fs = require('fs'); fs.readfilesync("./rs.txt",'utf8'); //注意这里对fs.txt的访问使用的是相对"readFile.js" 本身的路径
由于readFiles.js和要读取的目标rs.txt是在同级目录下,所以可以写相对路径。
运行代码
想要运行readFile.js这个文件有多种方式,根据当前处在的位置不同:
- A方案:如果终端中的路径定位在
pageA/code
目录下,则通过node readFile.js
就可以运行 - B方案:如果终端中的路径定位在
pageA
目录下,通过:node code/readFile.js
能成功执行.js文件,但是却找不到.txt文件的路径了。
原因分析
我们在fs中读取文件时,由于使用的是相对路径,所以在读这个文件的时,nodejs会去:
运行命令的小黑窗的路径 + 代码中的相对路径
找它。
所以上述代码中:
- A方案在运行时,找到的文件是
pageA/code/rs.txt
,它可以找到文件 - B方案在运行时,找到的文件是
pageA/rs.txt
,它就找到不文件了
解决方法: 就是在操作文件时,使用绝对路径来定位文件。
路径问题-使用绝对路径
目标
掌握 __dirname
和 __filename
的用法,并能在操作文件路径时,正确使用它们
复习回顾绝对与相对路径
相对与路绝位置在前面的学习中也有涉及,例如a标签的 href ,img标签的src属性在设置值时都可以写相对或者绝对地址。
例如:
<a href="./index.html">主页-相对地址</a> <a href="https://www.baidu.com/index.html">主页-绝对路径</a>
在nodejs, 我们提到的相对/绝对路径理解如下:
- 绝对路径: 从磁盘根目录开始到指定文件的路径。
- 相对路径:是以某个文件的位置为起点,相对于这个位置来找另一个文件。
__dirname __filename 获取绝对路径
nodejs中提供了两个全局变量来获取获取绝对路径:
- __filename:获取当前被执行的文件的绝对路径
- __dirname:获取当前被执行的文件的文件夹所处的绝对路径
全局变量的含义是:
- 变量:它们的值是变化的。在不同的文件中值就不同,因为文件的路径也不同嘛。
- 全局:在任意地方都可以直接使用。
测试使用
在任意代码的任意位置
console.log(__dirname) console.log(__filename)
在文件操作时,使用绝对路径
只需要在读入文件时,在文件名的前面拼接上路径:
// 拼接html5.jpg的绝对路径 // 1) 找到当前文件夹的绝对路径 console.log(__dirname) // 2) 加上 html5.jpg const fs = require('fs') const filePath = __dirname + '\\rs.txt' // 走一步,看一步 console.log(filePath) const rs = fs.readFileSync(filePath)
path模块
作用
作用是用来处理路径问题:拼接,分析,取后缀名等等。
- 官网文档地址
- 是node中的核心模块之一
使用步骤
- 引入模块
const path = require('path')
- 使用模块
调用API即可
常用的api
- path.basename() :此方法返回
path
的最后一部分。一般可用来获取路径中的文件名。 - path.join() :路径拼接。
- path.parse(pathurl) :把一个路径转成一个对象
示例
path.basename('/foo/bar/baz/asdf/quux.html');// 返回: 'quux.html' path.basename('/foo/bar/baz/asdf/quux.html', '.html');// 返回: 'quux' path.dirname('/foo/bar/baz/asdf/quux');// 返回: '/foo/bar/baz/asdf' path.extname('index.html');// 返回: '.html'
注意:path模块并不考虑其中地址是否真的存在,只是单纯调用方法,获取结果。
使用path模块解决文件读写中的路径拼写
// 拼接html5.jpg的绝对路径 // 1) 找到当前文件夹的绝对路径 console.log(__dirname) // 2) 加上 html5.jpg const fs = require('fs') const path = require('path') const filePath = path.join(__dirname, 'html5.jpg') // const filePath = __dirname + '\\html5.jpg' // 走一步,看一步 console.log(filePath) fs.readFile(filePath,function(err, data) { if(err) { console.log(err) return } console.log(data) })
附:path模块常用方法列表
方法 | 作用 |
path.basename(path[, ext]) | 获取返回 path 的最后一部分(文件名) |
path.dirname(path) | 返回目录名 |
path.extname(path) | 返回路径中文件的扩展名(包含.) |
path.format(pathObject) | 将一个对象格式化为一个路径字符串 |
path.join([...paths]) | 拼接路径 |
path.parse(path) | 把路径字符串解析成对象的格式 |
path.resolve([...paths]) | 基于当前工作目录拼接路径 |
附: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) | 判断路径是否存在 |
小结
- nodejs 是什么?
-
- 是一个基于chrome v8引擎的javascript 运行时
- 它是不是一个新语言,它只是一个环境,用来运行js代码
- 与浏览器的区别在?
-
- nodejs中没有dom,bom, window, 只有 ECMAScript
- 我们学它是图什么?
-
- 它是用来写后端功能,帮助我们了解后端程序员是如何工作;
- 提升竞争力,会后端优先!
- 后边学习前端框架的基础
- 学什么?
-
- 模块系统(核心模块 fs, path,自定义模块,第三方模块)
- npm 操作
- fs: 用来做文件(文件夹)操作:读\写\删除\创建.......
- path: 做路径相关的操作 path.join()
- __dirname, __filename : 在nodejs中,表示全局变量。用来获取绝对路径。
-
- __dirname : 获取当前被执行的文件所在的文件夹的绝对路径
- __filename: 获取当前被执行的文件的绝对路径
作业
对json数据进行操作,要求
根目录 ├── db │ └── data.json # 这里有数据 └── yourfile.js # 操作db/data.json
文件data.json
的内容如下:
[{"name":"小王"},{"name":"小李"}]
文件yourfile.js
是需要写代码去完成功能: node yourfile.js
之后,会在data.json中添加一条记录,{"name":"小张"}
// 这里写你的代码 // ......
会在data.json中添加内容,添加之后的效果如下:
[{"name":"小王"},{"name":"小李"},{"name":"小张"}]
测试题 :扫码测试
Day01: 初识Nodejs
- 知道nodejs是一个js运行环境,借助各种模块,它可以读写文件,处理路径...
目标
- 掌握Node.js的基本概念;
- 了解Node.js在前端和后端领域中的作用
Node.js是什么
导入
大家刚结束了大事件项目,有几个小问题来互动一下:
提问
:在项目中,我们作为前端程序员实现做什么事? 这些事需要后端同学配合吗?
提问
:前端要学什么编程语言?后端会用什么编程语言?
提问
:可以用js语言实现后端的功能吗?
Node.js是什么
官方概念:Node.js® 是一个基于 Chrome V8 引擎 的 JavaScript 运行时
(Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.)
上面的概念中有两个特殊的名词,解释如下:
- chrome V8引擎: chrome浏览器用来解析和执行js代码的工具;
- 运行时:理解为一个容器,用来运行代码的环境;
所以,对Node.js更通俗的解释是:一个用chrome浏览器V8引擎来跑JS代码的环境。
图示如下:
- 浏览器是javascript的前端运行环境;
- Node.js是javascript的后端运行环境;
Nodejs的理解
- Node全名是Node.js(也叫Node, nodejs, node.js),但它不是一个js文件,而是一个软件
- Node.js是一个基于Chrome V8引擎的javascript的运行环境,在这个环境中可以执行js代码
- Node.js提供了大量的内置模块及丰富的第三方模块,能够让我们完成文件读写、Web服务器、操作数据库等功能
Node.js的意义和学习内容
学习Node.js的意义
- 在Node环境下,写js代码实现后端的功能(web服务器,写接口,读写数据库.....)
- 了解后端程序员的工作,增加职场竞争力
- 它是前端框架(vue, react,angular)的运行基础,学好Node.js有助于为后续框架的学习打下基础
Node.js的学习内容
它只是一个环境,不是一门语言(不需要学习新语言
),我们要学习它的两个内容: 模块系统, npm包管理工具。
模块系统
。能用不同的模块来完成不同的功能,例如:创建web服务器,写接口,连接操作数据库
NPM包管理工具
。通过npm来管理我们的需要的第三方包,为后续学习框架打下基础
下装安装nodejs
下载
进入官网
点击左侧的按钮(有LTS标识的那个),会立即下载。
版本说明
- LTS: 长期稳定版(Long Term Support))。 项目开发建议使用长期稳定版
- Current: 最新版。最新版包含了一些新功能,如果想学习最新的功能,则可以使用该版本。最新版可能会有一些未知的bug。
安装
找到你下载的安装包,(不同系统选择对应的安装文件)
双击安装文件开始安装,傻瓜式安装,一路 next
即可
注意:
- 建议安装目录所使用
英文路径
(不要安装在类似于 d:/软件/node) - 安装完成之后, 它
不会
在桌面出现快捷图标,没法双击打开
测试是否安装成功
打开任意一个小黑窗,输入node -v
能够看到Nodejs版本号即为安装成功。
小结
去官网自行下载LTS版本;
安装完成之后,页面没有图标按钮;
上班之后,要问同事,具体的node版本是什么;
打开小黒窗的4种方式
打开小黒窗的方式,如下
在window系统中
方法1:cmd窗口(window+R, --->运行-->录入cmd,回车)
方法2:在资源管理器中,打开任意目录,直接在地址栏中写入 cmd
,并回车
方法3:powershell(window10操作系统)
在资源管理器中按下shift,同时点击鼠标右键,可以选择在此处打开powershell/命令行窗口。
方法4: vscode中的右键,在命令行中运行
苹果电脑操作:
参考1:https://jingyan.baidu.com/article/375c8e1969b5f065f3a22967.html
参考3:在 Mac 上的“终端”中执行命令和运行工具 - Apple 支持 (中国)
在Node环境下运行js代码
我们前面的学习中,js代码都是在浏览器中运行的,现在开始学习nodejs后,我们有了第二个环境中可以运行js代码。下面来学习如何在nodejs下运行js代码。
目标
掌握在NodeJS环境下运行js代码的步骤
步骤
- 准备js文件。准备好要被执行的js文件
- 写命令来运行
格式node 文件目录.js
。在命令行工具中写命令来运行这个文件
实操
准备一个JS文件
请事先准备好一个js文件。例设这里的路径是:d:/src/index.js
具体内容是
let a = 1; console.info(a + 2);
运行这个文件
打开命令行工具(请注意当前所处的位置),输入命令
格式: node 要执行的文件的路径
注意:node 的后面有一个空格
示例
node index.js node 01.js # 01.js就是当前目录下 node a/01.js # 01.js在目录a下面
Tip:
最好是在.js文件所在目录下来运行这个js文件
小结
nodejs就是一个环境,可以跑js代码
拓展:常用的命令行下的命令及按键
考虑到后面一段时间我们将会与这个小黒窗打交道,大家可以练习一下
命令及键盘按键
node 空格 某个js文件 # 调用 node 程序,运行某个js文件 clear 或者 cls # 清空界面 ls/dir # 查看列表(list) cd 目录名 # 进入到目录中去 cd .. # 返回上一级目录 cd \ # 直接回到根目录 Ctrl+C # 停止 Node 程序 输入部分文件名后按下 Tab 键 // 补全文件名 或 目录名, 多次tab会进行切换 ↑ ↓ 上下箭头 # 切换历史输入
复制粘贴
在小黑窗中复制内容:选中内容,再点鼠标右键
把粘贴板中的内容复制到小黑窗: 点鼠标右键
Node.js和浏览器端的区别
通过前面的学习,我们知道了有两个运行js代码的环境,那他们有什么区别呢?
在浏览器端
js由三部分组成:ECMAScript + BOM + DOM
es6 就是ECMAScript 6.0的简写,也泛指其之后的所有版本
ECMAScript是一种由Ecma国际(前身为欧洲计算机制造商协会,European Computer Manufacturers Association)通过ECMA-262标准化的脚本程序设计语言。是javascript语言的一个标准。它约定了:如何定义变量,函数,运算,数组,内置对象等等。
在nodejs端
有ECMAScript + 内置模块(fs, http, path,.....)。在nodejs中是没有BOM、DOM、window,但使用ECMAScript是通用的
NodeJS中没有DOM,也没有BOM,也没有window对象。
区别
相同点:
- 都是可以运行js代码的容器,更严格一点说:都可以运行ECMAScript
- 要下载安装才能使用
不同点:
- 各有不同的API: nodejs运行js时,不能写DOM,BOM,也不能用window对象了
- Nodejs 环境可以去实现后端的功能
- 浏览器环境可以去实现前端的功能
nodejs中的模块分类
每个模块都是一个独立的文件。每个模块都可以完成特定的功能,我们需要时就去引入它们,并调用。
nodejs模块的分类:
- 核心模块
-
- 就是nodejs自带的模块,在安装完nodejs之后,就可以任意使用
- 相当于学习js时使用的Array对象
- 源代码 node/lib at master · nodejs/node · GitHub
- 自定义模块
-
- 程序员自己写的模块
- 相当于我们在学习js时的自定义函数。
- 第三方模块
-
- 其他程序员写好的模块。nodejs生态提供了一个专门的工具npm来管理第三方模块,后面我们会专门讲到。
- 相当于别人写好的函数或者库。例如我们前面学习的axios, JQuery库,artTemplate等。
核心模块fs
目标
通过学习核心模块fs,掌握核心模块的基本使用方法
fs模块的文件
文档
学会查 API,远远比会几个 API 更重要
理解核心模块
- 核心模块就是 Node 内置的模块,需要通过唯一的标识名称来进行获取。
- 每一个核心模块基本上都是暴露了一个对象,里面包含一些方法供我们使用。
- 一般在加载核心模块的时候,变量(或常量)的起名最好就和核心模块的标识名同名。
- 例如:
const fs = require('fs')
,const path = require('path')
const path = require('path') console.log(path)
fs模块
fs模块(fs是 FileSystem的简写)是Node.js用来进行文件操作的模块,它属于核心模块。你引入之后就可以直接使用了。
核心模块的使用步骤:
- 引入模块
// 引入模块 const fs = require('fs'); // 可以使用var、let,但是建议使用const,因为我们不希望它被改变。 // 名字不必大写成FS,一般也就叫fs这个名字。
- 调用api实现自己的要求
fs.各种API(实参)
小结
- 核心模块的功能是nodejs提供的,具体要看文档;
- 使用步骤
-
- 引入。 const xxx = require('xxx')
-
-
- console.log(xx)
-
-
- 使用。
fs-readFileSync-文件读取
格式
const fs = require("fs") let rs = fs.readFileSync('文件路径',"utf8") // rs 就是读出来的内容 console.log(rs)
注意:api的名字结尾有Sync(async是异步的,sync表示同步的)
捕获同步格式中的错误对象
如果读成功,则会获取读出来的数据,如果失败了,则会中断后续所有的代码执行。
console.log(1) let res = fs.readFileSync('errorPath.js') console.log(res) console.log(2) // 这句代码是不会执行的
解决方案:用try. catch 结构
// try catch // try { // 可能会有错误的代码 // } catch(err){ // 如果try内的代码有错误,就会进入catch,并把错误传进来 // }
try { const fs = require("fs") let rs = fs.readFileSync('文件路径',"utf8"); console.log(rs) } catch(err) { console.log(err) }
fs-writeFileSync-文件写入
目标
掌握writeFileSync的使用
writeFileSync
功能:向指定文件中写入字符串, 如果没有该文件则尝试创建该文件。
格式:
fs.writeFileSync(pathName, content, option); // 参数1: 要写入的文件路径 --- 相对路径和绝对路径均可,推荐使用绝对路径 // 参数2: 要写入文件的内容 // 参数3: 配置项,设置写入的字符集,默认utf-8
注意:它是覆盖写入,会把文件中的内容全部删除,再填入新的内容。
示例1: 写入.txt文件
任务:写入约定文本内容
const fs = require('fs') fs.writeFileSync('./a.txt', 'hello world! \n 换一行')
示例2: 写入JSON数据
稍微把问题提升一下,问: 如何把数据写入文件中?
const fs = require('fs') const data = [{name: '小王', age: 20}] fs.writeFileSync('./a.txt', data)
上面的写法会出错: data不是一个字符串或者是Buffer
解决方式: 调用JSON.stringify先对内容做处理,转成字符串,再保存
const fs = require('fs') const data = [{name: '小王', age: 20}] fs.writeFileSync('./a.txt', JSON.stringify(data))
路径问题-相对路径的隐患
在读取文件时,使用相对路径是容易出问题的
。下面我们来看会出什么问题。
素材准备
假设有如下两个文件,它们所处的目录及文件名如下所示:
pageA └── code ├── readFile.js # 用来读txt └── rs.txt # 文本文件,具体的内容没有影响
readFile.js用来读出rs.txt中的内容,并显示。它的代码是这样的:
// code/readFile.js const fs = require('fs'); fs.readfilesync("./rs.txt",'utf8'); //注意这里对fs.txt的访问使用的是相对"readFile.js" 本身的路径
由于readFiles.js和要读取的目标rs.txt是在同级目录下,所以可以写相对路径。
运行代码
想要运行readFile.js这个文件有多种方式,根据当前处在的位置不同:
- A方案:如果终端中的路径定位在
pageA/code
目录下,则通过node readFile.js
就可以运行 - B方案:如果终端中的路径定位在
pageA
目录下,通过:node code/readFile.js
能成功执行.js文件,但是却找不到.txt文件的路径了。
原因分析
我们在fs中读取文件时,由于使用的是相对路径,所以在读这个文件的时,nodejs会去:
运行命令的小黑窗的路径 + 代码中的相对路径
找它。
所以上述代码中:
- A方案在运行时,找到的文件是
pageA/code/rs.txt
,它可以找到文件 - B方案在运行时,找到的文件是
pageA/rs.txt
,它就找到不文件了
解决方法: 就是在操作文件时,使用绝对路径来定位文件。
路径问题-使用绝对路径
目标
掌握 __dirname
和 __filename
的用法,并能在操作文件路径时,正确使用它们
复习回顾绝对与相对路径
相对与路绝位置在前面的学习中也有涉及,例如a标签的 href ,img标签的src属性在设置值时都可以写相对或者绝对地址。
例如:
<a href="./index.html">主页-相对地址</a> <a href="https://www.baidu.com/index.html">主页-绝对路径</a>
在nodejs, 我们提到的相对/绝对路径理解如下:
- 绝对路径: 从磁盘根目录开始到指定文件的路径。
- 相对路径:是以某个文件的位置为起点,相对于这个位置来找另一个文件。
__dirname __filename 获取绝对路径
nodejs中提供了两个全局变量来获取获取绝对路径:
- __filename:获取当前被执行的文件的绝对路径
- __dirname:获取当前被执行的文件的文件夹所处的绝对路径
全局变量的含义是:
- 变量:它们的值是变化的。在不同的文件中值就不同,因为文件的路径也不同嘛。
- 全局:在任意地方都可以直接使用。
测试使用
在任意代码的任意位置
console.log(__dirname) console.log(__filename)
在文件操作时,使用绝对路径
只需要在读入文件时,在文件名的前面拼接上路径:
// 拼接html5.jpg的绝对路径 // 1) 找到当前文件夹的绝对路径 console.log(__dirname) // 2) 加上 html5.jpg const fs = require('fs') const filePath = __dirname + '\\rs.txt' // 走一步,看一步 console.log(filePath) const rs = fs.readFileSync(filePath)
path模块
作用
作用是用来处理路径问题:拼接,分析,取后缀名等等。
- 官网文档地址
- 是node中的核心模块之一
使用步骤
- 引入模块
const path = require('path')
- 使用模块
调用API即可
常用的api
- path.basename() :此方法返回
path
的最后一部分。一般可用来获取路径中的文件名。 - path.join() :路径拼接。
- path.parse(pathurl) :把一个路径转成一个对象
示例
path.basename('/foo/bar/baz/asdf/quux.html');// 返回: 'quux.html' path.basename('/foo/bar/baz/asdf/quux.html', '.html');// 返回: 'quux' path.dirname('/foo/bar/baz/asdf/quux');// 返回: '/foo/bar/baz/asdf' path.extname('index.html');// 返回: '.html'
注意:path模块并不考虑其中地址是否真的存在,只是单纯调用方法,获取结果。
使用path模块解决文件读写中的路径拼写
// 拼接html5.jpg的绝对路径 // 1) 找到当前文件夹的绝对路径 console.log(__dirname) // 2) 加上 html5.jpg const fs = require('fs') const path = require('path') const filePath = path.join(__dirname, 'html5.jpg') // const filePath = __dirname + '\\html5.jpg' // 走一步,看一步 console.log(filePath) fs.readFile(filePath,function(err, data) { if(err) { console.log(err) return } console.log(data) })
附:path模块常用方法列表
方法 | 作用 |
path.basename(path[, ext]) | 获取返回 path 的最后一部分(文件名) |
path.dirname(path) | 返回目录名 |
path.extname(path) | 返回路径中文件的扩展名(包含.) |
path.format(pathObject) | 将一个对象格式化为一个路径字符串 |
path.join([...paths]) | 拼接路径 |
path.parse(path) | 把路径字符串解析成对象的格式 |
path.resolve([...paths]) | 基于当前工作目录拼接路径 |
附: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) | 判断路径是否存在 |
小结
- nodejs 是什么?
-
- 是一个基于chrome v8引擎的javascript 运行时
- 它是不是一个新语言,它只是一个环境,用来运行js代码
- 与浏览器的区别在?
-
- nodejs中没有dom,bom, window, 只有 ECMAScript
- 我们学它是图什么?
-
- 它是用来写后端功能,帮助我们了解后端程序员是如何工作;
- 提升竞争力,会后端优先!
- 后边学习前端框架的基础
- 学什么?
-
- 模块系统(核心模块 fs, path,自定义模块,第三方模块)
- npm 操作
- fs: 用来做文件(文件夹)操作:读\写\删除\创建.......
- path: 做路径相关的操作 path.join()
- __dirname, __filename : 在nodejs中,表示全局变量。用来获取绝对路径。
-
- __dirname : 获取当前被执行的文件所在的文件夹的绝对路径
- __filename: 获取当前被执行的文件的绝对路径
作业
对json数据进行操作,要求
根目录 ├── db │ └── data.json # 这里有数据 └── yourfile.js # 操作db/data.json
文件data.json
的内容如下:
[{"name":"小王"},{"name":"小李"}]
文件yourfile.js
是需要写代码去完成功能: node yourfile.js
之后,会在data.json中添加一条记录,{"name":"小张"}
// 这里写你的代码 // ......
会在data.json中添加内容,添加之后的效果如下:
[{"name":"小王"},{"name":"小李"},{"name":"小张"}]
测试题
- 各有不同的API: nodejs运行js时,不能写DOM,BOM,也不能用window对象了
- Nodejs 环境可以去实现后端的功能
- 浏览器环境可以去实现前端的功能
nodejs中的模块分类
每个模块都是一个独立的文件。每个模块都可以完成特定的功能,我们需要时就去引入它们,并调用。
nodejs模块的分类:
- 核心模块
-
- 就是nodejs自带的模块,在安装完nodejs之后,就可以任意使用
- 相当于学习js时使用的Array对象
- 源代码 node/lib at master · nodejs/node · GitHub
- 自定义模块
-
- 程序员自己写的模块
- 相当于我们在学习js时的自定义函数。
- 第三方模块
-
- 其他程序员写好的模块。nodejs生态提供了一个专门的工具npm来管理第三方模块,后面我们会专门讲到。
- 相当于别人写好的函数或者库。例如我们前面学习的axios, JQuery库,artTemplate等。
核心模块fs
目标
通过学习核心模块fs,掌握核心模块的基本使用方法
fs模块的文件
文档
学会查 API,远远比会几个 API 更重要
理解核心模块
- 核心模块就是 Node 内置的模块,需要通过唯一的标识名称来进行获取。
- 每一个核心模块基本上都是暴露了一个对象,里面包含一些方法供我们使用。
- 一般在加载核心模块的时候,变量(或常量)的起名最好就和核心模块的标识名同名。
- 例如:
const fs = require('fs')
,const path = require('path')
const path = require('path') console.log(path)
fs模块
fs模块(fs是 FileSystem的简写)是Node.js用来进行文件操作的模块,它属于核心模块。你引入之后就可以直接使用了。
核心模块的使用步骤:
- 引入模块
// 引入模块 const fs = require('fs'); // 可以使用var、let,但是建议使用const,因为我们不希望它被改变。 // 名字不必大写成FS,一般也就叫fs这个名字。
- 调用api实现自己的要求
fs.各种API(实参)
小结
- 核心模块的功能是nodejs提供的,具体要看文档;
- 使用步骤
-
- 引入。 const xxx = require('xxx')
-
-
- console.log(xx)
-
-
- 使用。
fs-readFileSync-文件读取
格式
const fs = require("fs") let rs = fs.readFileSync('文件路径',"utf8") // rs 就是读出来的内容 console.log(rs)
注意:api的名字结尾有Sync(async是异步的,sync表示同步的)
捕获同步格式中的错误对象
如果读成功,则会获取读出来的数据,如果失败了,则会中断后续所有的代码执行。
console.log(1) let res = fs.readFileSync('errorPath.js') console.log(res) console.log(2) // 这句代码是不会执行的
解决方案:用try. catch 结构
// try catch // try { // 可能会有错误的代码 // } catch(err){ // 如果try内的代码有错误,就会进入catch,并把错误传进来 // }
try { const fs = require("fs") let rs = fs.readFileSync('文件路径',"utf8"); console.log(rs) } catch(err) { console.log(err) }
fs-writeFileSync-文件写入
目标
掌握writeFileSync的使用
writeFileSync
功能:向指定文件中写入字符串, 如果没有该文件则尝试创建该文件。
格式:
fs.writeFileSync(pathName, content, option); // 参数1: 要写入的文件路径 --- 相对路径和绝对路径均可,推荐使用绝对路径 // 参数2: 要写入文件的内容 // 参数3: 配置项,设置写入的字符集,默认utf-8
注意:它是覆盖写入,会把文件中的内容全部删除,再填入新的内容。
示例1: 写入.txt文件
任务:写入约定文本内容
const fs = require('fs') fs.writeFileSync('./a.txt', 'hello world! \n 换一行')
示例2: 写入JSON数据
稍微把问题提升一下,问: 如何把数据写入文件中?
const fs = require('fs') const data = [{name: '小王', age: 20}] fs.writeFileSync('./a.txt', data)
上面的写法会出错: data不是一个字符串或者是Buffer
解决方式: 调用JSON.stringify先对内容做处理,转成字符串,再保存
const fs = require('fs') const data = [{name: '小王', age: 20}] fs.writeFileSync('./a.txt', JSON.stringify(data))
路径问题-相对路径的隐患
在读取文件时,使用相对路径是容易出问题的
。下面我们来看会出什么问题。
素材准备
假设有如下两个文件,它们所处的目录及文件名如下所示:
pageA └── code ├── readFile.js # 用来读txt └── rs.txt # 文本文件,具体的内容没有影响
readFile.js用来读出rs.txt中的内容,并显示。它的代码是这样的:
// code/readFile.js const fs = require('fs'); fs.readfilesync("./rs.txt",'utf8'); //注意这里对fs.txt的访问使用的是相对"readFile.js" 本身的路径
由于readFiles.js和要读取的目标rs.txt是在同级目录下,所以可以写相对路径。
运行代码
想要运行readFile.js这个文件有多种方式,根据当前处在的位置不同:
- A方案:如果终端中的路径定位在
pageA/code
目录下,则通过node readFile.js
就可以运行 - B方案:如果终端中的路径定位在
pageA
目录下,通过:node code/readFile.js
能成功执行.js文件,但是却找不到.txt文件的路径了。
原因分析
我们在fs中读取文件时,由于使用的是相对路径,所以在读这个文件的时,nodejs会去:
运行命令的小黑窗的路径 + 代码中的相对路径
找它。
所以上述代码中:
- A方案在运行时,找到的文件是
pageA/code/rs.txt
,它可以找到文件 - B方案在运行时,找到的文件是
pageA/rs.txt
,它就找到不文件了
解决方法: 就是在操作文件时,使用绝对路径来定位文件。
路径问题-使用绝对路径
目标
掌握 __dirname
和 __filename
的用法,并能在操作文件路径时,正确使用它们
复习回顾绝对与相对路径
相对与路绝位置在前面的学习中也有涉及,例如a标签的 href ,img标签的src属性在设置值时都可以写相对或者绝对地址。
例如:
<a href="./index.html">主页-相对地址</a> <a href="https://www.baidu.com/index.html">主页-绝对路径</a>
在nodejs, 我们提到的相对/绝对路径理解如下:
- 绝对路径: 从磁盘根目录开始到指定文件的路径。
- 相对路径:是以某个文件的位置为起点,相对于这个位置来找另一个文件。
__dirname __filename 获取绝对路径
nodejs中提供了两个全局变量来获取获取绝对路径:
- __filename:获取当前被执行的文件的绝对路径
- __dirname:获取当前被执行的文件的文件夹所处的绝对路径
全局变量的含义是:
- 变量:它们的值是变化的。在不同的文件中值就不同,因为文件的路径也不同嘛。
- 全局:在任意地方都可以直接使用。
测试使用
在任意代码的任意位置
console.log(__dirname) console.log(__filename)
在文件操作时,使用绝对路径
只需要在读入文件时,在文件名的前面拼接上路径:
// 拼接html5.jpg的绝对路径 // 1) 找到当前文件夹的绝对路径 console.log(__dirname) // 2) 加上 html5.jpg const fs = require('fs') const filePath = __dirname + '\\rs.txt' // 走一步,看一步 console.log(filePath) const rs = fs.readFileSync(filePath)
path模块
作用
作用是用来处理路径问题:拼接,分析,取后缀名等等。
- 官网文档地址
- 是node中的核心模块之一
使用步骤
- 引入模块
const path = require('path')
- 使用模块
调用API即可
常用的api
- path.basename() :此方法返回
path
的最后一部分。一般可用来获取路径中的文件名。 - path.join() :路径拼接。
- path.parse(pathurl) :把一个路径转成一个对象
示例
path.basename('/foo/bar/baz/asdf/quux.html');// 返回: 'quux.html' path.basename('/foo/bar/baz/asdf/quux.html', '.html');// 返回: 'quux' path.dirname('/foo/bar/baz/asdf/quux');// 返回: '/foo/bar/baz/asdf' path.extname('index.html');// 返回: '.html'
注意:path模块并不考虑其中地址是否真的存在,只是单纯调用方法,获取结果。
使用path模块解决文件读写中的路径拼写
// 拼接html5.jpg的绝对路径 // 1) 找到当前文件夹的绝对路径 console.log(__dirname) // 2) 加上 html5.jpg const fs = require('fs') const path = require('path') const filePath = path.join(__dirname, 'html5.jpg') // const filePath = __dirname + '\\html5.jpg' // 走一步,看一步 console.log(filePath) fs.readFile(filePath,function(err, data) { if(err) { console.log(err) return } console.log(data) })
附:path模块常用方法列表
方法 | 作用 |
path.basename(path[, ext]) | 获取返回 path 的最后一部分(文件名) |
path.dirname(path) | 返回目录名 |
path.extname(path) | 返回路径中文件的扩展名(包含.) |
path.format(pathObject) | 将一个对象格式化为一个路径字符串 |
path.join([...paths]) | 拼接路径 |
path.parse(path) | 把路径字符串解析成对象的格式 |
path.resolve([...paths]) | 基于当前工作目录拼接路径 |
附: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) | 判断路径是否存在 |
小结
- nodejs 是什么?
-
- 是一个基于chrome v8引擎的javascript 运行时
- 它是不是一个新语言,它只是一个环境,用来运行js代码
- 与浏览器的区别在?
-
- nodejs中没有dom,bom, window, 只有 ECMAScript
- 我们学它是图什么?
-
- 它是用来写后端功能,帮助我们了解后端程序员是如何工作;
- 提升竞争力,会后端优先!
- 后边学习前端框架的基础
- 学什么?
-
- 模块系统(核心模块 fs, path,自定义模块,第三方模块)
- npm 操作
- fs: 用来做文件(文件夹)操作:读\写\删除\创建.......
- path: 做路径相关的操作 path.join()
- __dirname, __filename : 在nodejs中,表示全局变量。用来获取绝对路径。
-
- __dirname : 获取当前被执行的文件所在的文件夹的绝对路径
- __filename: 获取当前被执行的文件的绝对路径
测试小练习:
对json数据进行操作,要求
根目录 ├── db │ └── data.json # 这里有数据 └── yourfile.js # 操作db/data.json
文件data.json
的内容如下:
[{"name":"小王"},{"name":"小李"}]
文件yourfile.js
是需要写代码去完成功能: node yourfile.js
之后,会在data.json中添加一条记录,{"name":"小张"}
参考结果(仅供参考)