【前端】NodeJS核心知识点整理

1.Node.js入门案例

1.1.什么是Node.js

在这里插入图片描述

JS是脚本语言,脚本语言都需要一个解析器才能运行。对于写在HTML页面里的JS,浏览器充当了解析器的角色。而对于需要独立运行的JS,NodeJS就是一个解析器。

每一种解析器都是一个运行环境,不但允许JS定义各种数据结构,进行各种计算,还允许JS使用运行环境提供的内置对象和方法做一些事情。例如运行在浏览器中的JS的用途是操作DOM,浏览器就提供了document之类的内置对象。而运行在NodeJS中的JS的用途是操作磁盘文件或搭建HTTP服务器,NodeJS就相应提供了fshttp等内置对象。

在这里插入图片描述

Node.js是一个调用内置ApI并且基于Chrome V8引擎的js运行环境,之前自己在本地总结了一些零散的只知识点,今天整合一下发出来。

1.2 Node.js可以做什么
  • 基于 Express 框架(http://www.expressjs.com.cn/),可以快速构建 Web 应用。
  • 基于 Electron 框架(https://electronjs.org/),可以构建跨平台的桌面应用
  • 基于restify框架(http://restify.com/),可以快速构建 API 接口项目
  • 读写和操作数据库、创建实用的命令行工具辅助前端开发
1.3.Node.js安装

下载链接:https://nodejs.org/en/

官方提供两个版本:

在这里插入图片描述

  • LTS:长期稳定版
  • Current:尝鲜版

按照官方提供的步骤安装完成后,查看node的版本

node -v

在这里插入图片描述

1.4.在Node.js中运行JS代码

(1)准备js代码

const name = "李祥";
console.log(name);

(2)运行js代码

李祥

2.Node.js内置的模块

2.1.文件系统fs模块

fs模块:node提供用来操作文件的内置模块,模块里有很多属性和方法,用于处理文件。

(1)读取文件内容

// path:路径
// options:编码格式
// callback:回调函数
fs.readFile(path,options,callback)
const fs = require('fs');
fs.readFile('./a.txt','utf-8',(err,data)=>{if(err){console.log(err);}console.log(data);
})
  • a.txt文件中的内容:

在这里插入图片描述

  • 运行结果:
I am 李祥
I like 写代码

(2)写入文件内容

// path:路径
// content:写入的内容,注意应是字符串方式
// callback:回调函数
fs.writeFile(path,content,callback);
const fs = require('fs');
const content = '写入文件的内容';
fs.writeFile('./a.txt',content,(err)=>{if(err){console.log(err);}console.log('写入成功');
});
  • a.txt文件中的内容:
写入文件的内容

(3)追加文件内容

// path:路径
// content:写入内容
// callback:回调函数
fs.appendFile(path,content,callback);
const fs = require('fs');
const contentAppend = '追加文件内容';
fs.appendFile('./a.txt',contentAppend,err=>{if(err){console.log(err);}console.log('追加成功');
});
  • a.txt文件中的内容:
写入文件的内容追加文件内容

注意点:

  • readFile只能读取已经存在的文件。
  • writeFile写入内容已经有文件,则创建同名文件,再写入文件。
  • readFile需要在writeFile后面读取,不然出错。
2.2.路径path模块

(1)解决node启动相对路径问题

执行启动node进程时,是以当前终端的路径进行拼接代码中的相对路径。当前路径有出入时,会出现路径拼接错误。

举个栗子:这段代码,如果我进到当前js文件的路径下进行执行没有问题。

在这里插入图片描述

但是,如果我在他的上一层执行这个文件,就会报错。

在这里插入图片描述

如何解决这个问题呢,路径前缀加上绝对路径的标识。

在这里插入图片描述

在这里插入图片描述

(2)join方法的用法

path.join用于路径的拼接

const fs = require('fs');
// 路径拼接的方法:path.join()
const dirPath = path.join(__dirname,'a.txt');
fs.readFile(dirPath,'utf-8',(err,data)=>{if(err){console.log(err);return;}console.log(data);
});

(3)获取文件的路径和扩展名

const path = require('path');//获取路径中的最后一部分 path.basename()
require('path').basename('/test/something') //运行结果:something
require('path').basename('/test/something.txt') //运行结果:something.txt
require('path').basename('/test/something.txt', '.txt') //运行结果:something//获取路径中的目录部分 dirname()
require('path').dirname('/test/something') // 运行结果:/test
require('path').dirname('/test/something/file.txt') // 运行结果:/test/something//获取路径中的扩展名部分 extname()
require('path').extname('/test/something') // 运行结果:''
require('path').extname('/test/something/file.txt') // 运行结果:'.txt'
2.3.网络http模块

定义Node.js提供创建web服务器

(1)初始化一个web服务器

// 引入http模块
const http = require('http');// 创建服务器
const server = http.createServer();//监听客户端的请求
server.on('request',(req,resp)=>{const mess = `请求地址:${req.url},请求方法:${req.method}`;//解决中文乱码的问题resp.setHeader('Content-Type', 'text/html;charset=utf-8');//响应的内容和结束本次请求resp.end(mess);
});//启动服务
server.listen(3000,()=>{console.log('服务运行在:http://127.0.0.1:3000');
});

(2)根据浏览器访问的url地址不同,返回不同的资源

//引入http模块
const http = require('http');//创建服务器
const server = http.createServer();//监听客户端的请求
server.on('request', (req, res) => {//设置默认的返回内容let mess = '404 页面请求失败';//判断请求的地址if (req.url === '/' || req.url === '/home') {mess = '<h1>首页</h1>';} else if (req.url === 'about') {mess = '<h1>关于</h1>';}res.setHeader('Content-Type', 'text/html;charset=utf-8');res.end(mess);
});//启动服务器
server.listen(3000, () => {console.log('服务运行在:http://127.0.0.1:3000');
});
2.4.缓冲区Buffer

Buffer 定义:Buffer 是内存区域,固定大小的内存块,可以将buffer视为数组,每个元素代表一个数据字节,由Node中Buffer类实现。

Buffer的数据形式:保存在Buffer中的数据是以十六进制的形式展示的,更加简短,但是计算机底层处理的还是二进制数据。

const buf = Buffer.from('lixiang');
console.log(buf);const buf1 = Buffer.from('理想');
console.log(buf1);//将字符串转成buffer
Buffer.from('lixiang');//创建一个指定大小的buffer
console.log(Buffer.alloc(10));//在buffer池中使用原有的buffer,可能含有敏感数据,但是性能会更好
console.log(Buffer.allocUnsafe(10));//将buffer转成字符串
const change = Buffer.from('lixiang');
change.toString();
  • 运行结果:
<Buffer 6c 69 78 69 61 6e 67>
<Buffer e7 90 86 e6 83 b3>
<Buffer 00 00 00 00 00 00 00 00 00 00>
<Buffer 00 00 00 00 00 00 00 00 00 00>
2.5.流Stream

Stream : 是一种以高效的方式处理读/写文件io、网络通信、或任何类型的端到端的信息交换。

在传统的方式中,读取文件时,会将文件从头到尾读入内存(buffer),然后进行处理。

使用流,则可以逐个片段地读取并处理。

const fs = require('fs');
const path = require('path');// 创建可读流
const flowa = fs.createReadStream(path.join(__dirname,'/a.txt'));
// 创建可写流
const flowb = fs.createWriteStream(path.join(__dirname,'/b.txt'));// 通过pipe建立管道流
flowa.pipe(flowb);// 监听数据完成流向
flowa.on('end',()=>{console.log('数据流向成功');
});

3.Express框架开发

3.1.Express框架发起请求

基于Node.js平台,快速、开发、极简的web开发框架。

其实就是node npm包管理工具中的第三方包,可以使用express快捷创建服务器。

其他的node框架koa2。

(1)发起get请求

// 创建服务器
const express = require("express");
const app = express();
app.get('/user/info',(req,resp)=>{console.log(req.query);console.log('查询用户信息');const userInfo = {id:10001,name:'李祥'}resp.send(userInfo);
});
  • 运行结果:
{"id":"100001","name":"李祥"
}

(2)发起post请求

// 创建服务器
const express = require("express");
const app = express();
app.post('/user/login',(req,resp)=>{console.log(req.body);console.log('查询用户信息');const userInfo = {code:200,msg:'',data:null}resp.send(userInfo);
});
  • 运行结果:
{"code":200,"msg":"","data":null
}
3.2.Express框架路由

express中的路由

前端中的路由 router 一样,在不同的路由页面展示不同的内容

express中的路由就是不同路径的接口,响应客户端不同的数据

(1)创建路由模块

const express = require("express");
// 创建路由模块
const router = express.Router();router.get('/user/info',(req,resp)=>{console.log(req.query);console.log('查询用户信息');const userInfo = {id:10001,name:'李祥'}resp.send(userInfo);
});router.post('/user/login',(req,resp)=>{console.log(req.body);console.log('查询用户信息');const userInfo = {code:200,msg:'',data:null}resp.send(userInfo);
});module.export = router;

(2)使用中间件注册路由模块

const router = require('./router/user');
//使用中间件注册路由模块
app.use(router);
  • 运行结果是一样的。
3.3.全局注册和局部注册

全局使用,直接用app.use()即可,所有的接口都会走中间件的逻辑

app.use(middle);

局部使用,就在指定的请求上加入中间件即可

当有多个中间件时,传入一个数组即可,一个就传入当前的这个中间件名称就可以了

app.get('/user/info',[middleA,middleB],(req,resp)=>{});

(1)中间件的定义

// 声明一个中间件
const middle = (req, res, next) => {console.log('一个中间件');/*** 逻辑处理*///逻辑处理完成后,必须调用next()将程序交给下个中间件或者路由,否则程序停止next();
};

(2)全局中间件注册

const express = require('express');
const app = express();const middleA = (req,resp,next)=>{console.log('中间件处理middleA');next();
}
app.use(middleA);
app.get('/user/info',(req,resp)=>{console.log(req.query);console.log('查询用户信息');const userInfo = {id:10001,name:'李祥'}resp.send(userInfo);
});
  • 运行结果:
控制台打印:
中间件处理middleA

(3)局部中间件注册

app.get('/user/info',middleA,(req,resp)=>{console.log(req.query);console.log('查询用户信息');const userInfo = {id:10001,name:'李祥'}resp.send(userInfo);
});
3.4.五种类型中间件

(1)内置中间件

  • express内置的中间件4.16.0+
  • express.json()解析json格式请求提数据
  • express.urlencoded()解析url-encoded格式请求体数据
app.use(express.json());
app.use(express.urlencoded());

(2)应用级别中间件

  • 全局中间件和局部中间件直接绑定在app的实例上,就叫应用级别中间件
//全局中间件
app.use(middleware);
//局部中间件
app.get("/user/info", middleware, () => {});

(3)路由级别中间件

  • 中间件绑定在路由router实例上
router.use(middleware);

(4)错误级别中间件

  • 在全局项目中捕获异常错误,防止项目报错异常崩溃
app.use((err, req, resp) => {resp.send(err.message);
});

(5)第三方中间件

  • body-parser中间件,解析请求体json、url-encoded数据
  • 下载:cnpm i body-parser -S
const bodyParser = require('body-parser');
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extend:false}));

OK,结束啦,记得给博主三连哦!!!
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据特征工程 | 主成分分析(Python)

特征抽取(feature extraction)和特征选择(feature selection)不一样,特征抽取是从原特征集中推导出有用的信息构成新的特征集。特征选择是从原特征集中选择一部分子集作为训练特征。 特征抽取将数据集从一个特征空间投影到了一个更低维度的特征空间。 主成分分析(princ…

Kubernetes - Ingress HTTP 负载搭建部署解决方案(新版本v1.21+)

在看这一篇之前&#xff0c;如果不了解 Ingress 在 K8s 当中的职责&#xff0c;建议看之前的一篇针对旧版本 Ingress 的部署搭建&#xff0c;在开头会提到它的一些简介Kubernetes - Ingress HTTP 负载搭建部署解决方案_放羊的牧码的博客-CSDN博客 开始表演 1、kubeasz 一键安装…

十大排序算法(C语言)

参考文献 https://zhuanlan.zhihu.com/p/449501682 https://blog.csdn.net/mwj327720862/article/details/80498455?ops_request_misc%257B%2522request%255Fid%2522%253A%2522169837129516800222848165%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&…

星闪技术 NearLink 一种专门用于短距离数据传输的新型无线通信技术

本心、输入输出、结果 文章目录 星闪技术 NearLink 一种专门用于短距离数据传输的新型无线通信技术前言星闪技术 NearLink 的诞生背景星闪技术 NearLink 简介星闪技术 NearLink 技术是一种蓝牙技术吗星闪技术 NearLink 优势星闪技术 NearLink 应用前景弘扬爱国精神星闪技术 Nea…

10000字!图解机器学习特征工程

文章目录 引言特征工程1.特征类型1.1 结构化 vs 非结构化数据1.2 定量 vs 定性数据 2.数据清洗2.1 数据对齐2.2 缺失值处理 原文链接&#xff1a;https://www.showmeai.tech/article-detail/208 作者&#xff1a;showmeAI 引言 上图为大家熟悉的机器学习建模流程图&#xff0c;…

技术资料MF74:将图像插入单元格注释

【分享成果&#xff0c;随喜正能量】须知往生净土&#xff0c;全仗信、愿。有信、愿&#xff0c;即未得三昧、未得一心不乱&#xff0c;亦可往生。且莫只以一心不乱&#xff0c;及得念佛三昧为志事&#xff0c;不复以信、愿、净念为事。。 我给VBA的定义&#xff1a;VBA是个人…

通过Vue自带服务器实现Ajax请求跨域(vue-cli)

通过Vue自带服务器实现Ajax请求跨域&#xff08;vue-cli&#xff09; 跨域 原理&#xff1a;从A页面访问到B页面&#xff0c;并且要获取到B页面上的数据&#xff0c;而两个页面所在的端口、协议和域名中哪怕有一个不对等&#xff0c;那么这种行为就叫跨域。注意&#xff1a;类…

[LaTeX] [数学符号] \mathbb{1}的各种替代方案:解决在 LaTeX 中输入黑板粗体的数字

[LaTeX] [数学符号] \mathbb{1}的各种替代方案&#xff1a;解决在 LaTeX 中输入黑板粗体的数字_latex mathbb-CSDN博客文章浏览阅读5w次&#xff0c;点赞36次&#xff0c;收藏80次。本文介绍如何在 LaTeX 中输入黑板粗体的数字。_latex mathbbhttps://blog.csdn.net/xovee/arti…

Android Studio 查看Framework源码

1、背景 安卓系统源码量很庞大&#xff0c;选择好的开发工具和方式去开发可以提升开发效率&#xff0c;常用的开发工具有Source Insight 、Visual Studio Code、Android Studio&#xff0c;vscode适合C和C代码开发&#xff0c;java层代码无法跳转和提示&#xff0c;因此&#…

vue3基础流程

目录 1. 安装和创建项目 2. 项目结构 3. 主要文件解析 3.1 main.js 3.2 App.vue 4. 组件和Props 5. 事件处理 6. 生命周期钩子 7. Vue 3的Composition API 8. 总结和结论 响应式系统&#xff1a; 组件化&#xff1a; 易于学习&#xff1a; 灵活性&#xff1a; 社…

Java中级面试题记录(四)

一面面试题 1.Innodb的行数据存储模式 https://baijiahao.baidu.com/s?id1775090633458928876&wfrspider&forpc 2.行数据包含哪些信息&#xff1f; https://baijiahao.baidu.com/s?id1775090633458928876&wfrspider&forpc 3.MySQL在进行存储VARCHAR的时…

DDOS版-超功能记事本 Ⅲ 8.8源码

DDOS版-超功能记事本 Ⅲ 8.8源码 下载地址&#xff1a;https://user.qzone.qq.com/512526231/main

goland无法调试问题解决

goland 无法调试问题解决 golang 版本升级后&#xff0c;goland 无法进行调试了 首先请看自己下载的版本是否有误 1.apple系 M系列芯片的 arm64版本 2.apple系 intel系列芯片的x86_64 3.windows系 intel解决如下&#xff1a; 查看gopath ericsanchezErics-Mac-mini gww-api…

C/C++数据结构之深入了解线性表:顺序表、单链表、循环链表和双向链表

线性表是一种基本的数据结构&#xff0c;它在计算机科学中起着至关重要的作用。线性表用于存储一系列具有相同数据类型的元素&#xff0c;这些元素之间存在顺序关系。在C/C中&#xff0c;我们可以使用各种方式来实现线性表&#xff0c;其中包括顺序表、单链表、循环链表和双向链…

【golang】Windows环境下Gin框架安装和配置

Windows环境下Gin框架安装和配置 我终于搞定了Gin框架的安装&#xff0c;花了两三个小时&#xff0c;只能说道阻且长&#xff0c;所以写下这篇记录文章 先需要修改一些变量&#xff0c;这就需要打开终端&#xff0c;为了一次奏效&#xff0c;我们直接设置全局的&#xff1a; …

大厂面试题-JVM中的三色标记法是什么?

目录 问题分析 问题答案 问题分析 三色标记法是Java虚拟机(JVM)中垃圾回收算法的一种&#xff0c;主要用来标记内存中存活和需要回收的对象。 它的好处是&#xff0c;可以让JVM不发生或仅短时间发生STW(Stop The World)&#xff0c;从而达到清除JVM内存垃圾的目的&#xff…

代码随想录Day31 贪心06 T738 单调递增的数字 T968监控二叉树

LeetCode T738 单调递增的数字 题目链接:738. 单调递增的数字 - 力扣&#xff08;LeetCode&#xff09; 题目思路: 我们以332举例,题目要我们获得的是小于等于332的最大递增数字,我们知道这个数字要递增只能取299了,332 -- 329 --299 我们从后向前遍历,只要前一位大于后一位,我…

系统架构设计师之使用McCabe方法可以计算程序流程图的环形复杂度

系统架构设计师之使用McCabe方法可以计算程序流程图的环形复杂度

conda虚拟环境配置

命令行输入&#xff0c;conda -V 确定conda版本 创建自己的conda虚拟环境 activate 回车 conda create -n 名字 python版本号 执行命令 确认执行命令 输入y 创建完成 激活环境 conda activate 名字 进入python环境 python 退出 exit() conda deactive

Text Classification via Large Language Models

Abstract 表达大模型在文本分类上做的不好。 原因&#xff1a; 1、处理复杂语境时缺少推理能力。(e.g… 类比、讽刺) 2、限制学习的上下文的token数。 提出了自己的策略&#xff1a; ** Clue And Reasoning Prompting (CARP).线索与推理提示** 1、能用prompt找到clue(语境线索…