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

news2024/12/23 14:30:13

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.coloradmin.cn/o/1144637.html

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

相关文章

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

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

基于白鲸优化算法BWO优化的VMD-KELM光伏发电短期功率预测MATLAB代码(含详细算法介绍)

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; VMD适用于处理非线性和非平稳信号&#xff0c;例如振动信号、生物信号、地震信号、图像信号等。它在信号处理、振动分析、图像处理等领域有广泛的应用&#xff0c;特别是在提取信号中的隐含信息和去除噪声方面…

无头浏览器自动化:Puppeteer 帮你释放效能 | 开源日报 No.64

facebook/react Stars: 209.5k License: MIT React是一个用于构建用户界面的JavaScript库。它具有以下优势和特点&#xff1a; 声明式&#xff1a;React使得创建交互式UI变得轻松。您可以为应用程序中的每个状态设计简单视图&#xff0c;当数据发生更改时&#xff0c;React会…

Postman日常操作

一.Postman介绍 1.1第一个简单的demo 路特斯&#xff08;英国汽车品牌&#xff09;_百度百科 (baidu.com) 1.2 cookie 用postman测试需要登录权限的接口时&#xff0c;会被拦截&#xff0c;解决办法就是每次请求接口前&#xff0c;先执行登录&#xff0c;然后记住cookie或者to…

ChineseChess5 2023.10.28

中国象棋残局&#xff1a;黑双卒单车压境解棋

iphone备份后怎么转到新手机,iphone备份在哪里查看

iphone备份会备份哪些东西&#xff1f;iphone可根据需要备份设备数据、应用数据、苹果系统等。根据不同的备份数据&#xff0c;可备份的数据类型不同&#xff0c;有些工具可整机备份&#xff0c;有些工具可单项数据备份。本文会详细讲解苹果手机备份可以备份哪些东西。 一、ip…

婚礼的魅力

昨日有幸被邀请去当伴郎&#xff0c;虽然是替补&#xff0c;即别人鸽了&#xff0c;过去救急&#xff0c;但总归是去起作用。 婚礼的魅力&#xff0c;感受到了&#xff0c;满满的仪式感&#xff0c;紧凑的流程&#xff0c;还有不断的拍照&#xff0c;做视频&#xff0c;留下美好…

接口测试到底怎么做,5分钟时间看完这篇文章彻底搞清楚

01、通用的项目架构 02、什么是接口 接口&#xff1a;服务端程序对外提供的一种统一的访问方式&#xff0c;通常采用HTTP协议&#xff0c;通过不同的url&#xff0c;不同的请求类型&#xff08;GET、POST&#xff09;&#xff0c;不同的参数&#xff0c;来执行不同的业务逻辑。…

2.Vue — 模板语法、数据绑定、el与data的写法、数据代理

文章目录 一、模板语法1.1 插值语法1.2指令语法 二、数据绑定语法2.1 单向数据绑定2.2 双向数据绑定 三、el与data的两种写法3.1 el3.2 data 四、数据代理4.1 Object.defineProperty4.2 Vue数据代理4.2.1 展示数据代理4.2.2 Vue数据代理 一、模板语法 root容器里面的代码被称为…

Ajax学习笔记第二天

喜欢的东西太贵了&#xff0c;我一咬牙&#xff0c;狠下心决定不喜欢了&#xff01; 【一.GET请求】 【1.1 URL即信息】 我们知道php的相关运算都是在服务器端进行的&#xff0c;此时我们要考虑一个问题&#xff0c;如何将要计算的数字带给服务器&#xff1f;我们可以通过UR…

如何能在项目具体编码实现之前能尽可能早的发现问题并解决问题

在项目的具体编码实现之前尽可能早地发现并解决问题&#xff0c;可以大大节省时间和资源&#xff0c;提高项目的成功率。以下是一些策略和方法&#xff1a; 1. 明确需求和预期&#xff1a; 确保所有的项目需求都是清晰和明确的。需求模糊不清是项目失败的常见原因之一。与利益…

java - IDEA IDE - 设置字符串断点

文章目录 java - IDEA IDE - 设置字符串断点概述笔记END java - IDEA IDE - 设置字符串断点 概述 IDE环境为IDEA2022.3 在看一段序列化的代码, 想找出报错抛异常那个点, 理解一下代码实现. 因为序列化代码实现在第三方jar包中, 改不了(只读的). 根本数不清第几次才会开始报…

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; 社…

Ubuntu 23.10(Mantic Minotaur)正式发布,支持Linux 6.5和GNOME 45

导读Canonical 近日正式发布了 Ubuntu 23.10&#xff08;Mantic Minotaur&#xff09;操作系统&#xff0c;其中包含一些最新的 GNU/Linux 技术、改进的硬件支持以及许多其他变化。 Ubuntu 23.10 采用了最新的 Linux 6.5 内核系列&#xff0c;并为 Ubuntu 桌面和服务器增强了 z…

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

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

嵌入式-数码管控制

一、数码管显示数字&#xff0c;P2_4, P2_3,P2_2,这三个组合起来代表1-8的二进制表示代表1-8个led。P0代表要显示的数字的16进制表示。 这个图就是表示led灯, 比如要显示数据6&#xff0c;那就是0111 1101&#xff0c;那么16进制就是0x7D,所以p00x7D 二、数码管&#xff0c;动…

C/C++数据结构之深入了解树与二叉树:概念、存储结构和遍历

树是一种常见的数据结构&#xff0c;它在计算机科学和数学中都有广泛的应用。树结构的最简单形式是二叉树&#xff0c;本文将深入探讨树和二叉树的概念、存储结构以及二叉树的遍历&#xff0c;并提供一些实际的代码示例来帮助理解这些概念。 树与二叉树的概念 树 (Tree) 树是…

[双指针] Leetcode 283.移动零和1089.复习零

[双指针] Leetcode 283.移动零和1089.复习零 移动零 283. 移动零 1.题意分析 (1) 给你一个数组&#xff0c;将数组中的所有0移动到数组的末尾 (2) 保证非0元素在数组中相对位置不变 (3) 在原数组中操作 2.解题思路 由于题目要求我们移动数组内容&#xff08;也就是交换两…

【JAVA学习笔记】49 - String类,StringBuffer类,StringBuilder类(重要)

String类 一、String入门 1) String对象用于保存字符串&#xff0c;也就是一组字符序列 2)字符串常量对象是用双引号括起的字符序列。例如: "你好"、 "12.97"、 "boy"等 3)字符串的字符使用Unicode字符编码&#xff0c;一个字符&#xff08;不…

城市群(Megalopolis)/城际(inter-city)OD相关研究即Open Access数据集调研

文章目录 1 城市群/城际OD定义2 理论模型与分析方法2.1 重力模型 Gravity Model2.2 干预机会模型 Intervening Opportunities Model2.3 辐射模型 Radiation Model 3 Issues related to OD flows3.1 OD Prediction3.2 OD Forecasting3.3 OD Construction3.4 OD Estimation 4 OD …