Node.js入门指南(一)

目录

Node.js入门

什么是Node.js

Node.js的作用

Node.js安装

Node.js编码注意事项

Buffer(缓冲器)

定义

使用

fs模块

概念

文件写入

文件读取

文件移动与重命名

文件删除

文件夹操作

查看资源状态

路径问题

path模块


Node.js入门

什么是Node.js

何为Node.js,官方的定义是:Node.js是一个开源的,跨平台的JavaScript运行环境。简单的来讲,Node.js就是一款应用程序,是一款软件,它可以运行JavaScript。

Node.js的作用

它的主要功能有:开发服务器应用,让我们可以通过向服务器发送请求,服务器可以返回我们想要的数据。

开发工具类应用:我们熟悉的Webpack,Vite以及Babel,可以提高我们前端的开发效率与质量。而它们三者都是借助Node.js的开发能力而实现的。

开发桌面端应用,比如我们熟悉的VScode,它是借助electron框架实现的,而electron又是借助与Node.js开发出来的。

Node.js安装

如何进行安装呢?可以打开Nodo.js对应的官网:Node.js。会出现以下的界面,然后可以点击进行安装,一般都是点击右边的,因此左边的版本会长期维护,也是官方推荐使用的。

但是由于Node.js官网是在国外,因此可以下载会比较慢,也可以直接访问国内的网站:Node.js 中文网。下载方式相同,还可以查看并选择之前的所有的Node.js版本CNPM Binaries Mirror。点击对应自己想要的版本下载即可。一路next,下载完毕之后,打开命令窗口,输入node -v来进行判断是否安装成功,若有输出版本即表示安装成功。

Node.js编码注意事项

在浏览器中的JavaScript包括两大块,其一为核心语法:ECMAScript。其二为Web API,包括:DOM,BOM,AJAX,Storage,console,定时器以及alter等。而在Node.js中的JavaScript,核心语法也是ECMAScript,不同点在于它有属于自己的Node API,包括:fs,url,http,util,console,定时器,path等。

在Node.js中不能使用BOM和DOM的API,可以使用console和定时器API。Node.js中的顶级对象为global,也可以用globalThis访问顶级对象。

Buffer(缓冲器)

定义

Buffer 是一个类似于数组的对象   ,用于表示固定长度的字节序列。Buffer 本质是一段内存空间,专门用来处理 二进制数据   。它的大小是固定的且无法调整。性能较好,可以直接对计算机内存进行操作。每个元素的大小为 1 字节( byte )。

使用

创建的方式有如下的三种:第一种使用Buffer.alloc。创建的时候会申请内存空间,传入的数字为需要申请多少字节数的Buffer,它会让每一个字节的值都为0。

第二种使用Buffer.allocUnsafe,使用它是需要注意,用它创建的buffer中可能会存在旧的数据,可能会影响执行的结果,但是它的创建速度会比使用Buffer.alloc快。

第三种是使用Buffer.from进行创建,它可以传入字符串或者数组来进行创建Buffer。在控制台输出的是十六进制。

// 1.alloc
let buf=Buffer.alloc(10);
console.log(buf);//<Buffer 00 00 00 00 00 00 00 00 00 00>
// 2.allocUnsafe
let buf2=Buffer.allocUnsafe(10);
console.log(buf2);//<Buffer 00 00 00 00 00 00 00 00 00 00>
// 3.from
let buf3=Buffer.from('hello');
let buf4 = Buffer.from([105, 108, 111, 118, 101, 121, 111, 117]);
console.log(buf3)//<Buffer 68 65 6c 6c 6f>
console.log(buf4)//<Buffer 69 6c 6f 76 65 79 6f 75>

我们可以使用toString方法来将Buffer转为字符串。toString默认是按照utf-8编码方式来进行转换的。

let buf = Buffer.from([105, 108, 111, 118, 101, 121, 111, 117]);
console.log(buf.toString())//iloveyou

除此之外,我们也可以读取以及修改Buffer,通过使用[ ]的方式来对数据进行处理。

let buf = Buffer.from('hello');
// 读取下标为4的字符
console.log(buf[4])//111
// 对其进行修改
buf[4]=98;
// 读取对应的字符串
console.log(buf.toString())//hellb

注意: 如果修改的数值超过255 ,则超过 8 位数据会被舍弃 。 一个 utf-8 的字符一般 占 3 个字节。

fs模块

概念

fs 全称为 file system ,称之为 文件系统 ,是 Node.js 中的 内置模块 ,可以对计算机中的磁盘进行操作。例如文件的创建、删除、重命名、移动以及文件内容的写入、读取等文件夹的相关操作。

文件写入

使用writeFile异步写入 ,它可以传四个参数:file文件名,data文件中需要写入的数据,options选项设置(可选)以及callback写入回调。在回调函数中声明一个形参err,当我们写入失败时err则是写入失败的错误对象,若写入成功,它等于null。
// 导入fs模块
const fs=require("fs");
// 写入文件
fs.writeFile('./study.txt','今天学习Node.js',err=>{
  if(err){
    console.log("写入失败");
    return;
  }
  console.log('写入成功');
});

当我们执行js文件之后,我们就可以在同级的目录下创建一个名为study.txt,里面编写了“今天学习Node.js”的txt文件。若本身该目录下就有对应的文件,则它会重新编写里面的内容。

我们还可以采取writeFileSync进行文件的写入,相比于writeFile方式,它是一种同步的执行方式,并且它只有三个参数,没有最后一个回调函数的参数。写法如下:

// 导入fs模块
const fs=require("fs");
fs.writeFileSync('./study.txt','这是一个同步的写入')

补充:可能有一些小伙伴对同步以及异步还不太清楚,说白了同步就是顺序的执行,主线程 会等待其他线程的执行结果,然后再继续执行主线程的代码,效率较低。而异步不是顺序执行的。主线程不会等待其他线程的执行结果,直接执行后续的主线程代码,效率较高。

那你有没有想过,若我们想要在原本的文件中继续编写东西,不覆盖原先编写的内容,那我们该如果实现呢?我们可以使用到前面介绍的writeFile方法,在第三个参数中设它的配置项为:{flag:'a'}即可实现文件内容的追加。

// 导入fs模块
const fs=require("fs");
// 写入文件
fs.writeFile('./study.txt','并且发布一篇博客!',{flag:'a'},err=>{
  if(err){
    console.log("写入失败");
    return;
  }
  console.log('写入成功');
});

除了使用以上的方式进行追加,还可以使用appendFile / appendFileSync 进行追加写入。appendFile 语法与 writeFile 语法完全相同。都是异步的,而appenFileSync则与writeFileSync相似,都是同步的。不同点在与一个是写入,一个是进行追加。

// 导入fs模块
const fs=require("fs");
// 使用appendFile写入文件
fs.appendFile('./study.txt','并且发布一篇博客!',err=>{
  if(err){
    console.log("写入失败");
    return;
  }
  console.log('写入成功');
});
//使用appendFileSync
fs.appendFileSync('./study.txt','然后睡觉');
// 若想要换行使用/r/n
fs.appendFileSync('./study.txt','\r\n然后睡觉');

接一下在介绍一种文件写入方法:createWriteStream 流式写入,流式写入方式适用于大文件写入或者频繁写入的场景, writeFile 适合于 写入频率较低的场景。

// 导入fs模块
const fs=require("fs");
// 创建写入流对象
const ws=fs.createWriteStream('./study.txt');
// write
ws.write("前天学习Webpack\r\n");
ws.write("昨天学习ES6\r\n");
ws.write("今天学习Node.js\r\n");
//关闭通道,可写可不写
ws.close();

最后文件写入有哪些应用场景呢?下载文件、安装软件 、保存程序日志,如 Git 、编辑器保存文件 、视频录制都使用到了文件的写入。当需要持久化保存数据的时候,应该想到文件写入。

文件读取

Node.js也提供了一些读取文件的方式,第一种方式可以使用readFile 异步读取,其接收三个参数:path 文件路径 ,options 选项配置(可写可不写) ,callback 回调函数。回调函数有两个参数,err以及data,第一个是接受读取失败的对象,第二个参数则是读取到的文件的数据。

第二种方式可以使用readFileSync同步读取进行同步读取。只接受两个参数:path 文件路径 ,options 选项配置(可选)。

// 导入fs模块
const fs=require("fs");
// 使用readFile进行异步读取
fs.readFile('./study.txt',(err,data)=>{
  if(err){
    console.log('读取失败');
    return;
  }
  // 使用toString()转为了字符串
  console.log(data.toString());
});
//使用readFileSync同步读取
let data=fs.readFileSync('./study.txt');
console.log(data.toString());

除了以上的两种方式可以读取文件,还可以使用createReadStream 流式读取。它接受两个参数:path 文件路径 ,options 选项配置(可选)。它不是将文件中的数据一次性读取出来的,而是一块一块地进行读取。适用于读取大的文件,对大文件进行处理。它每一个chunk可以读取65536字节(64KB)大小的数据。

// 导入fs模块
const fs=require("fs");
// 创建读取流对象
const rs=fs.createReadStream("./study.txt");
//绑定data事件
rs.on('data',chunk=>{
  console.log(chunk.length);
})
//绑定end事件。可选
rs.on('end',()=>{
  console.log('读取完毕');
});

文件读取的应用场景有很多,比如:电脑开机 、程序运行 、编辑器打开文件 、查看图片 、播放视频 、播放音乐 、Git 查看日志 、上传文件 以及查看聊天记录等。

文件移动与重命名

在 Node.js 中,我们可以使用 rename renameSync 来移动或重命名文件或文件夹。 fs.rename该方法是异步的,接收三个参数: oldPath 文件当前的路径、 newPath 文件新的路径、 callback 操作后的回调。而fs.renameSync是同步的,并且只接收前两个参数,没有回调函数参数。
// 导入fs模块
const fs=require("fs");
// 调用rename方法修改名字
fs.rename('./study.txt','./play.txt',err=>{
  if(err){
    console.log('操作失败');
    return;
  }
  console.log('操作成功');
});
//调用rename方法来移动文件
fs.rename('./play.txt','./课程代码/paly.txt',err=>{
  if(err){
    console.log('操作失败');
    return;
  }
  console.log('操作成功');
});

// 调用renameSync方法修改名字
fs.renameSync('./paly.txt','./study.txt');

文件删除

当我们需要删除文件时,我们可以使用Node.js提供的unlink 法以及rm方法。两个方法的接受参数都相同:path 文件路径 ,callback 操作后的回调。它们都有对应的同步方法:unlickSync以及rmSync。在此就只对它们的异步方法进行演示。

// 导入fs模块
const fs=require("fs");
//调用unlink方法
fs.unlink('./study.txt',err=>{
  if(err){
    console.log("删除失败");
    return;
  }
  console.log("删除成功")
});
//调用rm方法
fs.rm('./study.txt',err=>{
  if(err){
    console.log("删除失败");
    return;
  }
  console.log("删除成功")
});

文件夹操作

Node.js 除了可以对文件进行操作之外,我们还可以对文件夹进行 创建 、 读取 、 删除 等操作。
首先在 Node.js 中,我们可以使用 mkdir mkdirSync 来创建文件夹。mkdir方法接受三个参数:
path 文件夹路径 、options 选项配置( 可选 ) 、callback 操作后的回调。而mkdirSync只接受前两个参数。前者为异步方法后者为同步方法。
// 导入fs模块
const fs=require("fs");
//使用mkdir创建单个文件夹
fs.mkdir('./Node.js',err=>{
  if(err){
    console.log('创建失败');
    return;
  }
  console.log('创建成功')
});
//使用递归创建
fs.mkdir('./a/b/c',{recursive:true},err=>{
  if(err){
    console.log('创建失败');
    return;
  }
  console.log('创建成功')
});
当我们需要在创建的文件夹下面再创建文件夹时,我们就需要使用到mkdir方法的第二个参数:通过设置{recursive:true},让其可以实现递归创建。
在 Node.js 中,我们可以使用 readdir 或 readdirSync 来读取文件夹。readdir 接受三个参数: path 文件夹路径、options 选项配置( 可选 )以及callback 操作后的回调。回调有两个形参,err以及data,err接受失败的对象,data为接受成功时的数据,将读取到的文件夹中存在的文件的名称以数组的形式输出。
// 导入fs模块
const fs=require("fs");
fs.readdir('./',(err,data)=>{
  if(err){
    console.log('读取失败');
    return;
  }
  console.log(data);
});

在 Node.js 中,我们可以使用 rmdir rmdirSync 来删除文件夹。rmdir方法接受三个参数:path 文件夹路径、options 选项配置( 可选 )以及callback 操作后的回调。若想要进行递归地删除文件夹,需要设置第二个参数为:{recursive:true}。但是不推荐使用rmdir进行递归地删除,因为运行之后会有警告。所以若想要进行递归删除,可以使用 rm 来进行操作,使用方式也rmdir相同。
// 导入fs模块
const fs=require("fs");
//使用rmdir进行删除
fs.rmdir('./Node.js',err=>{
  if(err){
    console.log('删除失败');
    return;
  }
  console.log('删除成功');
})
//使用rmdir进行递归删除(不推荐)
fs.rmdir('./a',{recursive:true},err=>{
  if(err){
    console.log('删除失败');
    return;
  }
  console.log('删除成功');
})
//使用rm进行递归删除(推荐)
fs.rm('./a',{recursive:true},err=>{
  if(err){
    console.log('删除失败');
    return;
  }
  console.log('删除成功');
})

查看资源状态

我们可以使用 stat statSync 来查看资源的详细信息 ,stat 接受三个参数:path 文件夹路径、options 选项配置( 可选 )、callback 操作后的回调。
// 导入fs模块
const fs=require("fs");
//stat方法
fs.stat('./study.txt',(err,data)=>{
  if(err){
    console.log(err);
    return;
  }
  // 输出资源的状态
  console.log(data);
  //用于判断该资源是否为文件
  console.log(data.isFile());
  //用于判断该资源是否为文件夹
  console.log(data.isDirectory());
})

路径问题

fs 模块对资源进行操作时,路径的写法有两种:相对路径以及绝对路径。
// 导入fs模块
const fs=require("fs");
//相对路径
fs.writeFileSync('./index.html','N-A');
//绝对路径
fs.writeFileSync('D:/index.html','N-A')
但是需要注意的是:相对路径中所谓的当前目录 ,指的是命令行的工作目录 ,而并非是文件的所在目录。所以当命令行的工作目录与文件所在目录不一致时,会出现一些 BUG。
 
因为我们引入了 __dirname 。__dirname 与 require 类似,都是 Node.js 环境中的'全局'变量。__dirname 保存着 当前文件所在目录的绝对路径 ,可以使用 __dirname 与文件名拼接成绝对路径。
// 导入fs模块
const fs=require("fs");
let data = fs.readFileSync(__dirname + '/study.txt');
console.log(data);
使用 fs 模块的时候,尽量使用 __dirname 将路径转化为绝对路径,这样可以避免相对路径产生的
Bug。

path模块

path 模块提供了 操作路径 的功能,以下是它较为常用的几个 API:
API
说明
path.resolve拼接规范的绝对路径 常用
path.sep获取操作系统的路径分隔符
path.parse解析路径并返回对象
path.basename获取路径的基础名称
path.dirname获取路径的目录名
path.extname获得路径的扩展名
// 导入fs模块
const fs=require("fs");
const path=require('path');
//resolve 会使得路径的分隔符统一,解决了__dirname拼接之后路径不太规范的问题。
console.log(path.resolve(__dirname,'./index.html'));//D:\编程\前端\index.html
//sep
console.log(path.sep);// windows下为 \ Linux下为 /
//parse方法可以对路径进行解析,返回一个对象:root,dir,base,ext以及name
//先通过__filename获取当前文件的绝对路径
let str=__filename;
console.log(path.parse(str));//返回一个对象:root,dir,base,ext以及name
//basename
console.log(path.basename(str));//index.js
//dirname
console.log(path.dirname(str));//D:\编程\前端  
//extname
console.log(path.extname(str));//.js

好啦!Node.js的介绍就先到这里了,接下来还会持续更新!拜拜!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/177907.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SSH连接远程服务器报错:WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED 解决方法

一.错误描述 报错信息里提示了路径信息/root/.ssh/known_hosts:20 二.解决方案 方法一 输入以下指令&#xff1a; ssh-keygen -R XXX&#xff08;需要连接远程服务器的ip&#xff09; 按照我的例子ip:10.165.7.136&#xff0c;会返回以下信息: 重新尝试连接&#xff1a; 输…

数据结构学习笔记——多维数组、矩阵与广义表

目录 一、多维数组&#xff08;一&#xff09;数组的定义&#xff08;二&#xff09;二维数组&#xff08;三&#xff09;多维数组的存储&#xff08;四&#xff09;多维数组的下标的相关计算 二、矩阵&#xff08;一&#xff09;特殊矩阵和稀疏矩阵&#xff08;二&#xff09;…

7种SQL的进阶用法

1.自定义排序&#xff08;ORDER BY FIELD&#xff09; 在MySQL中ORDER BY排序除了可以用ASC和DESC之外&#xff0c;还可以使用自定义排序方式来实现。 CREATE TABLE movies ( id INT PRIMARY KEY AUTO_INCREMENT, movie_name VARCHAR(255), actors VARCHAR(255), price DEC…

MySQL面试,MySQL事务,MySQL锁,MySQL集群,主从,MySQL分区,分表,InnoDB

文章目录 数据库-MySQLMySQL主从、集群模式简单介绍1、主从模式 Replication2、集群模式3、主从模式部署注意事项 UNION 和 UNION ALL 区别分库分表1.垂直拆分2、水平拆分 MySQL有哪些数据类型1、整数类型**&#xff0c;2、实数类型**&#xff0c;3、字符串类型**&#xff0c;4…

MySQL 事务的底层原理和 MVCC(一)

在事务的实现机制上&#xff0c;MySQL 采用的是 WAL&#xff08;Write-ahead logging&#xff0c;预写式日志&#xff09;机制来实现的。 在使用 WAL 的系统中&#xff0c;所有的修改都先被写入到日志中&#xff0c;然后再被应用到系统中。通常包含 redo 和 undo 两部分信息。 …

初识Java 18-2 泛型

目录 构建复杂模型 类型擦除 C中的泛型 迁移的兼容性 类型擦除存在的问题 边界的行为 对类型擦除的补偿 创建类型实例 泛型数组 本笔记参考自&#xff1a; 《On Java 中文版》 构建复杂模型 泛型的一个优点就是&#xff0c;能够简单且安全地创建复杂模型。 【例子&am…

广告机/商业显示屏_基于MT878安卓主板方案

安卓主板在广告机领域扮演着重要的角色。无论是在商场、车站、酒店、电梯、机场还是高铁站&#xff0c;LED广告机广泛应用&#xff0c;并通过不同方式进行播放和管理。 广告机/商业显示屏_基于MT878安卓主板方案 基于MT8788安卓主板方案的广告机采用了联发科MT8788八核芯片方案…

力扣.面试题 04.06. 后继者(java 树的中序遍历)

Problem: 面试题 04.06. 后继者 文章目录 题目描述思路解题方法复杂度Code 题目描述 设计一个算法&#xff0c;找出二叉搜索树中指定节点的“下一个”节点&#xff08;也即中序后继&#xff09;。 如果指定节点没有对应的“下一个”节点&#xff0c;则返回null。 思路 由于题…

msvcp140.dll是什么?msvcp140.dll丢失的有哪些解决方法

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“msvcp140.dll丢失”。这个错误通常会导致某些应用程序无法正常运行。为了解决这个问题&#xff0c;我们需要采取一些措施来修复丢失的msvcp140.dll文件。本文将详细介绍5个解决msvcp140.dl…

visual studio 如何建立 C 语言项目

安装这个 模块。 新建 空项目 创建完成 写demo 点击运行&#xff1a;

计算机毕业设计 基于微信小程序的“共享书角”图书借还管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

经典中的经典之字符串

前言&#xff1a;前段时间发烧了&#xff0c;所以耽误了很多事情&#xff0c;一直没有更新&#xff0c;多穿点衣服&#xff0c;感冒不好受。 接下来有时间就会陆续更新一些基础的算法题&#xff0c;题目都很经典&#xff0c;大家可以先尝试着做&#xff0c;再看 解析。 第一…

7.HTML中列表标签

7.列表标签 7.1无序列表&#xff08;重点&#xff09; 表格是用来显示数据的&#xff0c;那么列表就是用来布局的。 列表最大的特点就是整齐&#xff0c;整洁&#xff0c;有序&#xff0c;他作为布局会更加自由和方便&#xff0c; 根据使用的情景不同&#xff0c;列表可分为三…

改进YOLOv5 | C3模块改动篇 | 轻量化设计 |骨干引入动态卷积|CondConv

🗝️YOLOv5实战宝典--星级指南:从入门到精通,您不可错过的技巧   -- 聚焦于YOLO的 最新版本, 对颈部网络改进、添加局部注意力、增加检测头部,实测涨点 💡 深入浅出YOLOv5:我的专业笔记与技术总结   -- YOLOv5轻松上手, 适用技术小白,文章代码齐全,仅需 …

2017年全国硕士研究生入学统一考试管理类专业学位联考数学试题——解析版

文章目录 2017 级考研管理类联考数学真题解析一、问题求解&#xff08;本大题共 5 小题&#xff0c;每小题 3 分&#xff0c;共 45 分&#xff09;下列每题给出 5 个选项中&#xff0c;只有一个是符合要求的&#xff0c;请在答题卡上将所选择的字母涂黑。真题&#xff08;2017-…

基于Qt的UDP通信、TCP文件传输程序的设计与实现——QQ聊天群聊

&#x1f64c;秋名山码民的主页 &#x1f602;oi退役选手&#xff0c;Java、大数据、单片机、IoT均有所涉猎&#xff0c;热爱技术&#xff0c;技术无罪 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 获取源码&#xff0c;添加WX 目录 前言一…

词向量笔记

一、词向量的世界排名比赛MTEB MTEB: Massive Text Embedding Benchmark 二、词向量的维数 词向量的维数d1一般取20~500之间

数据结构与算法编程题11

已知两个链表A和B分别表示两个集合&#xff0c;其元素递增排列。 请设计算法求出A与B的交集&#xff0c;并存放于A链表中。 a: 1, 2, 2, 4, 5, 7, 8, 9, 10 b: 1, 2, 3, 6, 7, 8 #include <iostream> using namespace std;typedef int Elemtype; #define ERROR 0; #defin…

基于鹈鹕算法优化概率神经网络PNN的分类预测 - 附代码

基于鹈鹕算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于鹈鹕算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于鹈鹕优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神经网络的光滑…

Linux文件

目录 一、基本概念 二、研究进程和被打开文件的关系 &#xff08;一&#xff09;w方式 &#xff08;二&#xff09;a方式 三、认识系统接口&#xff0c;操作文件 &#xff08;一&#xff09;认识文件描述符 &#xff08;二&#xff09;举例 &#xff08;三&#xff09;…