Node.js基本安装及使用

132 阅读11分钟

初识Node.js

Node.js基本安装及使用

1.Node.js 的定义

Node.js 是一个基于 Chrome V8 引擎 的 JavaScript 运行时环境

名词解释

  • chrome V8引擎: 在chrome浏览器用来解析和执行js代码的工具;

  • 运行时:理解为一个容器,用来运行代码的环境;这个环境让JS有读写文件,操作数据库,开启web服务器等能力

  • 注意:Node.js 只是JS的服务端运行环境,不是一门语言(不需要学习新语言),而只需要学习它里面新的Api

    1652058579599

2.Node.js作用

2.1前端运行环境

浏览器是JS的前端运行环境(开发网站)

1652058702100

2.2后端运行环境

Node.js是JS的后端运行环境(开发小程序、桌面应用、原生App、后端开发)

1652058728943

2.3Node.js环境与浏览器环境的区别

1652060855115

1652060860310

  • 在浏览器端: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官方网站

中文网

Nodejs.cn/

nodejs.org/zh-cn/

1652061064010

建议下载长期维护版

注意

  1. win10 可以随意安装任何版本的Node

  2. 但是win7只能安装12及其以下的版本Node

3.2安装

点击下载到的安装包,一路下一步默认安装

注意:

  1. 不能安装到中文目录如d:/软件(完整的路径中都不能出现中文,否则在后续的使用中会出现影响),建议一直点击next即可
  2. 安装完成之后, 它不会在桌面出现快捷图标

3.3验证是否安装成功

打开终端(命名行):在任意地方使用win+r 再输入cmd

1652061894515.png

在终端输入node -v进行查看安装的版本,如果没显示就表示没安装成功,请重新再试.

1652061947501.png

3.4命令行终端的打开方式

因为使用node.js就必须使用终端来运行,这里完善一下打开命令行终端的集中方式

小黑窗:是我们给 命令行工具 起的一个昵称

window系统打开小黑窗的几种方式
  1. windows + R 运行窗口中输入cmd 回车即可打开

  2. 在任意目录的最上方路径输入框中输入 cmd 回车接口打开 (推荐)

  3. 在任意目录中按住 shift键 + 鼠标右键后在弹出菜单中点击 在此处打开命令窗口 或 在此处打开PowerShell窗口即可打开

1652062180492.png

  1. 在VSCode中,任意一个js文件上鼠标右键,选择在 集成终端中打开

苹果电脑操作:

jingyan.baidu.com/article/375…

4.在Node环境下运行js代码

场景:vscode中新建一个01nodejs执行体验.js,console.log()输出一段文本, 利用node执行后看到输出表示执行成功

1652062818647

步骤

  1. 新建01nodejs执行体验.js
  2. 编写代码:console.log('nodejs执行输出啦');
  3. 打开小黑窗,输入 node 01nodejs执行体验.js 回车看结果

注意:node后面要加空格,格式: node 空格 要执行的js文件

1652062933098

5.在Node环境下运行各种js语法

步骤
  1. 新建02node执行各种js语法.js
  2. 在文件中定义 let obj ={age:20}; let arr = [1,2,3]; node执行后打印obj和arr看看结果(能正常执行)
  3. 在文件中编写 if(1==1) {} else {} node执行后打印结果(能正常执行)
  4. 在文件中编写 alert(1)node执行时时会报错(alert is not defined)表示node环境中没有window不能操作dom
  5. 在文件中编写 while(true){console.log(1);}node执行后会一直打印1,此时该如何停止呢?在小黑窗中按 ctrl + c 终止

6.学习常用的命令及按键

命令及键盘按键

1652066892964

复制和粘贴
  1. 在小黑窗中复制内容:选中内容,再点鼠标右键
  2. 把粘贴板中的内容复制到小黑窗: 直接在小黑窗点鼠标右键

核心模块-文件读写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)=>{}

步骤
  1. 在day01文件夹下 创建 /异步读取文件/rd.js 和 /异步读取文件/1.txt两个文件

  2. 在1.txt中随便输入一个字符串内容

  3. 在rd.js中导入fs核心模块 const fs = require(‘fs’)

  4. fs.readFile(‘./1.txt’,’utf8’,(err,data)=>{ consloe.log(data); })

  5. 进入异步读取文件目录打开小黑窗,执行 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字符串表示即可

步骤

  1. 在day01文件夹下 创建 /同步读取文件/rd.js 和 /同步读取文件/1.txt两个文件
  2. 在1.txt中随便输入一个字符串内容
  3. 在rd.js中导入fs核心模块 const fs = require(‘fs’)
  4. let res = fs.readFileSync(‘./1.txt’,’utf8’)读取到内容后直接返回,所以使用变量保存
  5. 进入同步读取文件目录打开小黑窗,执行 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)=>{}

步骤

  1. 在day01文件夹下 创建 /异步覆盖写入文件/wd.js 和 /异步覆盖写入文件/1.txt两个文件
  2. 在wd.js中导入fs核心模块 const fs = require(‘fs’)
  3. fs.writeFile(‘./1.txt’,’白日依山尽’,’utf8’,(err)=>{ consloe.log(‘写入成功’); })
  4. 进入异步覆盖写入文件目录打开小黑窗,执行 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编码

步骤

  1. 在day01文件夹下 创建 /同步覆盖式写入文件/wd.js 和 /同步覆盖式写入文件/1.txt两个文件
  2. 在wd.js中导入fs核心模块 const fs = require(‘fs’)
  3. fs.writeFileSync(‘./1.txt’,’白日依山尽’,’utf8’ })
  4. 进入同步覆盖式写入文件目录打开小黑窗,执行 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. 读写异步方法错误处理,由方法本身捕获并通过回调函数第1个参数传给编码者
  2. 同步方法需要编码者使用 **try{}catch(err){}**主动捕获错误

练习

1.练习1

1652097819647代码展示

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

1652097884321

代码展示

// 将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("文件写入成功");
    })
})