当前位置: 首页 > news >正文

【前端】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,结束啦,记得给博主三连哦!!!
在这里插入图片描述

相关文章:

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

1.Node.js入门案例 1.1.什么是Node.js JS是脚本语言&#xff0c;脚本语言都需要一个解析器才能运行。对于写在HTML页面里的JS&#xff0c;浏览器充当了解析器的角色。而对于需要独立运行的JS&#xff0c;NodeJS就是一个解析器。 每一种解析器都是一个运行环境&#xff0c;不但…...

计算机操作系统重点概念整理-第三章 进程同步【期末复习|考研复习】

第三章 进程同步 【期末复习|考研复习】 计算机操作系统系列文章传送门&#xff1a; 第一章 计算机系统概述 第二章 进程管理 第三章 进程同步 第四章 内存管理 第五章 文件管理 第六章 输出输出I/O管理 文章目录 第三章 进程同步 【期末复习|考研复习】前言三、进程同步3.1 临…...

day06-Flex布局

Flex布局 目标&#xff1a;熟练使用 Flex 完成结构化布局 01-标准流 标准流也叫文档流&#xff0c;指的是标签在页面中默认的排布规则&#xff0c;例如&#xff1a;块元素独占一行&#xff0c;行内元素可以一行显示多个。 02-浮动 基本使用 作用&#xff1a;让块元素水平排…...

架构整洁之道摘录

软件架构 软件架构规则和其他变量完全⽆关。 软件设计的终极⽬标是⽤最⼩的成本来满⾜构建和维护系统的需求。 程序设计重要的是软件架构的灵活性⽽不是先实现功能。 软件系统的第⼀价值体系是系统⾏为&#xff0c;第⼆价值体系是系统架构 编程范式 结构化编程 利⽤if/else…...

流程引擎-自定义函数的应用

背景&#xff1a; 某些业务需求比较特殊&#xff0c;需要在表单中校验或实现一些功能&#xff0c;泛微流程表单配置时实现的方式多种多样&#xff1a;JS脚本、SQL语句、公式以及其他一些标准化拖拽功能&#xff0c;本次给大家分享一下流程表单中的公式实现的一些需求场景。泛微…...

ChatGLM系列二:ChatGLM2的介绍及代码实践

一、介绍 2023年06月25日&#xff0c;清华大学开源了 ChatGLM2-6B 模型&#xff0c;是 ChatGLM 模型的升级版本。ChatGLM2-6B 在多个方面有显著提升&#xff1a;模型性能更强&#xff0c;在各种测试集上的表现更好&#xff1b;支持更长的上下文&#xff0c;最大上下文长度提升…...

JDBC对数据库进行操作

一.使用JDBC查询数据库表t_user的所有数据 1.User表 名称 数据类型 主键 是否为空 说明 ID number 是 用户编号 NAME Varchar2(50) 用户名 AGE varchar2(5) 用户年龄 BIRTH date 用户生日 PWD varchar2(20) 否 用户密码 import java.sql.Connection; import java.sql.Date; …...

unity 使用Image的RectTransform来进行判断是否点击到

public RectTransform LeftTouchArea;public RectTransform RightTouchArea;private void Update(){if (Input.GetMouseButtonDown(0)){//获取鼠标的位置Vector2 mousePos Input.mousePosition;//判断Image的坐标是否包含点击的坐标if (RectTransformUtility.RectangleContain…...

【C++】类与对象 第一篇(class,this)

目录 什么是类&#xff1f; 类的引入 class 类的两种定义方式: 声明与定义分离 类的访问限定符号 访问限定符​编辑 C中struct和class的区别是什么? 封装 类的作用域 类的实例化 类对象模型 如何计算类对象的大小 this指针 C语言和C实现Stack的对比 C语言实现…...

嵌入式软件工程师面试题——2025校招专题(四)

说明&#xff1a; 面试题来源于网络书籍&#xff0c;公司题目以及博主原创或修改&#xff08;题目大部分来源于各种公司&#xff09;&#xff1b;文中很多题目&#xff0c;或许大家直接编译器写完&#xff0c;1分钟就出结果了。但在这里博主希望每一个题目&#xff0c;大家都要…...

actual combat 21——华为云从零开始项目部署(附nginx转发域名方式)

一、IP地址方式&#xff1a; 后端&#xff1a; 确保项目本地跑通建立并运行华为云流水线 前端&#xff1a; 打包&#xff08;测试环境&#xff09;手动上传 nginx&#xff1a; 配置一下即可 华为云&#xff1a; 安全组&#xff1a;暴露后端网关端口安全组&#xff1a;暴…...

@CallSuper注解方法学习

CallSuper注解是什么&#xff1f; CallSuper 是 Android 开发中使用的一个注解&#xff0c;它的主要用途是确保在子类重写父类的方法时&#xff0c;调用 super 方法。这在某些情况下是非常有用的&#xff0c;例如当你希望在重写方法时保留父类的默认行为&#xff0c;或者确保子…...

03_Flutter自定义下拉菜单

03_Flutter自定义下拉菜单 在Flutter的内置api中&#xff0c;可以使用showMenu实现类似下拉菜单的效果&#xff0c;或者使用PopupMenuButton组件&#xff0c;PopupMenuButton内部也是使用了showMenu这个api&#xff0c;但是使用showMenu时&#xff0c;下拉面板的显示已经被约定…...

如何查看多开的逍遥模拟器的adb连接端口号

逍遥模拟器默认端口号为&#xff1a;21503。 不过&#xff0c;使用多开器多开的时候&#xff0c;端口就不一定是21503了。 如何查看&#xff1f; 进入G:\xiaoyao\Microvirt\MEmu\MemuHyperv VMs路径中 每多开一个模拟器&#xff0c;就会多出一个文件夹。 进入你要查找端口号…...

2023年中国道路扫雪车分类、市场规模及发展前景分析[图]

道路扫雪车是一种专门用于清除道路上积雪和冰雪的机动车辆&#xff0c;通常配备有雪铲、扫雪刷、除冰剂喷洒系统等装置&#xff0c;用于在雪季或寒冷气候条件下&#xff0c;对道路进行清扫、除雪、除冰等作业&#xff0c;以确保道路的通行安全。 道路扫雪车行业分类 资料来源&…...

【机器学习】迁移学习(Transfer)详解!

1. 什么是迁移学习 迁移学习(Transfer Learning)是一种机器学习方法&#xff0c;就是把为任务 A 开发的模型作为初始点&#xff0c;重新使用在为任务 B 开发模型的过程中。迁移学习是通过从已学习的相关任务中转移知识来改进学习的新任务&#xff0c;虽然大多数机器学习算法都是…...

软件测试面试题

软件测试面试时一份好简历的重要性 软件的生命周期&#xff08;prdctrm&#xff09; 计划阶段&#xff08;planning&#xff09;-〉需求分析&#xff08;requirement&#xff09;-〉设计阶段&#xff08;design&#xff09;-〉编码&#xff08;coding&#xff09;->测试&am…...

分治算法解决归并排序问题

分治算法定义&#xff1a;分治算法是一种问题解决方法&#xff0c;它将一个大问题划分为多个相同或相似的子问题&#xff0c;然后递归地解决这些子问题&#xff0c;最后将子问题的解合并得到原问题的解 作用&#xff1a; 排序算法分治算法在排序算法中得到广泛应用。例如&…...

Spring Security漏洞防护—HttpFirewall和 HTTPS

一、HttpFirewall Spring Security有几个领域&#xff0c;你所定义的 pattern 会针对传入的请求进行测试&#xff0c;以决定应该如何处理请求。这发生在 FilterChainProxy 决定请求应该通过哪个过滤链时&#xff0c;以及 FilterSecurityInterceptor 决定哪些安全约束适用于请求…...

Makefile泛谈

Makefile工作原理 1、检查规则中的依赖文件是否存在。 2、若依赖文件不存在&#xff0c;则寻找是否有规则用来生成该依赖文件。 譬如&#xff0c;执行文件会先寻找.o文件是否存在&#xff0c;如果不存在&#xff0c;就会再寻找是否有规则可以生成该依赖文件。如果缺少了main.…...

Python的快捷键

Python Python使用的小快招关于注释关于格式写主函数如何看函数源代码 Python使用的小快招 本文主要记录了写python代码的时候提高效率的一些小妙招 关于注释 选中要注释的代码&#xff0c;然后按下Ctrl /即可对多段代码注释。 关于格式 对于python代码的格式&#xff0c…...

css为盒子设置滚动条隐藏滚动条

省流&#xff1a;为盒子设置宽高&#xff0c;设置滚动条方向&#xff0c;隐藏滚动条。 首先&#xff0c;要为需要添加滚动条的盒子设置固定的高度和宽度&#xff0c;这样才能让内容超过盒子的边缘。 .box {width: 300px;height: 300px; }然后&#xff0c;给盒子加入overflow属…...

音视频开发常见问题(四):视频花屏和绿屏

摘要 本文介绍了视频视频花屏/绿屏问题的常见原因&#xff0c;如丢失关键帧、metadata的变化、硬件编解码的兼容性问题和颜色格式不一致问题。以及排查方法和解决策略&#xff0c;包括检查视频数据格式、排查自采集/自渲染模块问题、联系第三方音视频SDK技术支持等。最后&…...

设计模式—创建型模式之单例模式

设计模式—创建型模式之单例模式 介绍 单例模式说明&#xff1a;一个单一的类&#xff0c;负责创建自己的对象&#xff0c;同时确保系统中只有单个对象被创建。 单例模式特点&#xff1a; 某个类只能有一个实例&#xff1b;&#xff08;构造器私有&#xff09;它必须自行创…...

7.现代卷积神经网络

#pic_center R 1 R_1 R1​ R 2 R^2 R2 目录 知识框架No.1 深度卷积神经网络 AlexNet一、AlexNet二、D2L代码注意点三、QA No.2 使用块的网络 VGG一、VGG二、D2L代码注意点三、QA No.3 网络中的网络 NiN一、NIN二、D2L代码注意点三、QA No.4 含并行连结的网络 GoogLeNet / Incep…...

配置Super-VLAN下的DHCP服务器示例

组网需求 如图1所示&#xff0c;某公司拥有两个部门&#xff0c;为了节省IP地址&#xff0c;部门A和部门B规划为同一网段&#xff1b;为了提升业务安全性&#xff0c;将不同部门的用户划分到不同VLAN中。企业管理员为了方便统一管理&#xff0c;希望部门内终端通过DHCP服务器动…...

【开源】基于SpringBoot的城市桥梁道路管理系统的设计和实现

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询城市桥梁4.2 新增城市桥梁4.3 编辑城市桥梁4.4 删除城市桥梁4.5 查询单个城市桥梁 五、免责说明 一、摘要 1.1 项目介绍 基于VueSpringBootMySQL的城市桥梁道路管理系统&#xff0c;支持…...

关于根据动态数量的对象的某属性的数组数量呈乘机式增长的数据处理

adta是原始数组,currentIndex默认是零,currentObject初始对象,result处理生成的结果 function generateObjects(data, currentIndex, currentObject, result) {if (currentIndex data.length) {result.push(currentObject);return;}const currentCode data[currentIndex].co…...

数据分析和互联网医院小程序:提高医疗决策的准确性和效率

互联网医院小程序已经在医疗领域取得了显著的进展&#xff0c;为患者和医疗从业者提供了更便捷和高效的医疗服务。随着数据分析技术的快速发展&#xff0c;互联网医院小程序能够利用大数据来提高医疗决策的准确性和效率。本文将探讨数据分析在互联网医院小程序中的应用&#xf…...

asp.net学生考试报名管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net学生考试报名管理系统是一套完善的web设计管理系统系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使 用c#语言开发 应用技术&#xff1a;asp…...