day22JS-npm中的部分插件使用方法

1. 静态资源目录

静态资源目录就是访问服务器的某些路劲时候,服务器可以吐出一个写好的指定页面。

实现思路:

1、先判断要找的路径是否是文件,如果是文件,就加载发给对方。

2、如果是文件夹,找到这个文件夹所在路径中有没有index.html,如果有加载发送。

3、如果文件夹,并没有index.html,加载404发送。

案例:

1. 创建一个api的文件夹,打开集成终端执行npm init -y 命令得到一个package.json文件,编写该文件。

{"name": "api","version": "1.0.0","description": "","main": "index.js","scripts": {"start": "nodemon PORT=4000"},"keywords": [],"author": "","license": "ISC","devDependencies": {"nodemon": "^3.1.4"},"dependencies": {"cheerio": "^1.0.0","jsonwebtoken": "^9.0.2","mime": "^3.0.0","node-xlsx": "^0.24.0"}
}

 2. 创建入口文件index.js ,

3.创建staticPublic.js文件,编写该文件。在集成终端中执行npm start 命令启动命令。

const http = require("http");
const path = require("path");
const mime = require("mime");
// 创建一个服务
http.createServer(async function (req, res) {// 获取到响应对象的路劲let url = req.url;// 加载let [result, mimeType] = await getFile(url)//编写请求头res.writeHead(200, {// 如果是文本文件就解析它,如果不是文本文件就直接返回"Content-Type": /text/.test(mimeType) ? mimeType + ";charset=utf-8" : mimeType})res.end(result);
}).listen(process.env.PORT)// 获取文件函数
async function getFile(url) {// 获取当前文件的上一级路劲并拼接上publicconst paths = path.join(path.resolve(), "public", url);// 使用fsp.stat()方法获取到路劲最后面的路劲判断是不是文件const stat = await fsp.stat(paths).catch(e => { });// 不是文件的情况,则返回404页面if (!stat) {return await getFile("/404.html");}// 是文件的情况if (stat.isFile()) {// 使用mime.getType()方法判断文件类型return [await fsp.readFile(paths), mime.getType(paths)];// 是文件夹的情况} else if (stat.isDirectory()) {// 获取到当前文件的上一级路劲并拼接上index.html页面return await getFile(path.join(url, "./index.html"))}
}

4.在入口文件index.js 中导入staticPublic.js文件。

require("./staticPublic")

5. 创建一个public的文件夹,在创建一个image文件夹存放几张图片。

6. 在public的文件夹下创建一个index.html文件和一个404.html文件,并编写该文件。

index.html文件:

<body><a href="#">超链接</a><img src="/img/img_12.JPG">
</body>

 404.html文件:

<body><h1>404</h1>
</body>

2. 爬虫

爬虫:获取一个网页中全部的文件和内容。一般用于静态页面。

爬虫使用的插件:cheerio是模仿jQuery方式实现的一个第三方爬虫解析插件,可以将文本像html一样通过选择器和筛选器将数据分离。

方法:

cheerio.load(数据结果) :加载数据。

$("标签名/类名/id名").each((index, item) => { ...} : 遍历。

$(标签名).attr("属性名"); :获取标签的某个属性。

1. 在api的文件夹下创建一个reptile.js文件,并编写该文件。

// 引入https模块
const https = require("https");
// 引入爬虫插件
const cheerio = require("cheerio");
// querystring解析模块
const querystring = require("querystring");
// 引入文件模块
const fsp = require("fs/promises")
const path = require("path");
// 获取到网址
https.get("https://news.163.com/", async function (respone) {let list = [];// 调用该函数获取到网址上的数据let result = await getData(respone)// 使用cheerio.load()解析数据let $ = cheerio.load(result)// 使用元素选择器获取到所有的img标签,然后遍历// index:元素索引, item:元素$("img").each((index, item) => {// 获取到img标签的src属性let src = $(item).attr("src");// 没有src属性的情况if (!src) {// 使用querystring.parse()解析获取到data-original属性src = querystring.parse($(item).attr("data-original").split("?")[1]).url;}list.push(src);})for (var i = 0; i < list.length; i++) {// 如果没有https开头就要添加一个httpsif (!/https?/.test(list[i])) list[i] = "https:" + list[i];let result = await getFile(list[i]);if (!result) continue;let fileName = list[i].split("/").pop();await fsp.writeFile(path.join(path.resolve(), "./public/img", fileName), result)}
})// 获取数据的函数
function getData(req) {return new Promise(function (resolve, reject) {let data = ""req.on("data", _chunk => data += _chunk);req.on("end", () => resolve(data))})
}// 获取文件数据都函数
function getFile(url) {return new Promise(function (resolve, reject) {https.get(url, async function (respone) {let result = await getImageData(respone);resolve(result);})})
}// 获取图片数据的函数
function getImageData(req) {return new Promise(function (resolve, reject) {let data = Buffer.alloc(0);req.on("data", _chunk => {data = Buffer.concat([data, _chunk], data.length + _chunk.length);});req.on("end", () => resolve(data))})
}

2.在入口文件index.js 中导入reptile.js文件。

require("./reptile");

3. Excel表格解析

        Excel表格解析需要先下一个第三方模块node-xlsx,这里完成了一个excel表格筛选重建的内容然后创建一个新的表格文件。

1. 在api的文件夹下创建一个excels.js文件,并编写该文件。

const fsp = require("fs/promises");
const xlsx = require("node-xlsx");
const path = require("path");
init();
async function init() {// 读取文件内容let result = await fsp.readFile(path.join(path.resolve(), "./public/excel/cjd.xlsx"))// 使用xlsx.parse()解析数据,获得一个数组对象let data = xlsx.parse(result);// 把总分不及格的人筛选出来let data1 = data[0].data.filter((item, index) => {// 不是元素第4项直接跳出if (index < 4) return true;return Number(item[item.length - 1]) < 60;})// 创建一张excels表格let buffer = xlsx.build([{ name: "不及格的成绩单", data: data1 }]);// 把筛选出来数据写入表格await fsp.writeFile(path.join(path.resolve(), "./public/excel/a.xlsx"), buffer)
}

2. 在入口文件index.js 中导入excels.js文件。

require("./excels");

4.  Crypto原生加密

引入语法:const crypto = require("crypto");

方法:

crypto.createHmac(加密key, 要加密的字符串) .update("更新的密码").digest("指定字符集")

const crypto = require("crypto");
var str = 'abcdef';
var hash = crypto.createHmac("sha256", str).update("123456").digest("dex")
console.log(hash);

5. bcrypt 第三方加密  

下载命令:npm i bcrypt -S

加密:

 bcrypt.hash(password,10,function(err,encryted){console.log(encryted);})

验证: 

 bcrypt.compare(pass,hash,function(err,bool){console.log(bool);})

6. jsonwebtoken加密

下载命令:npm i jsonwebtoken

引入语法const jsonwebtoken = require("jsonwebtoken");

方法:

jsonwebtoken.sign(要加密的字符串, 加密key):加密

jsonwebtoken.verify(要解密密的字符串, 加密key):解密

对称加密 :加密的秘钥和解密的秘钥完全相同的

非对称加密 :加密的秘钥和解密的秘钥不相同的。jsonwebtoken使用借助于openssl密钥的生成。私钥加密,公钥解密。

openssl下载地址:Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions

打开openssl命令行:openssl

生成一个2048位的私钥:genrsa -out rsa_private_key.pem 2048

根私钥生成公钥:rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

 加密:

const jsonwebtoken = require("jsonwebtoken");
let key = "xietian";let str = "abcdef";
let hash = jsonwebtoken.sign(str, key);
console.log(hash);

解密: 

const jsonwebtoken = require("jsonwebtoken");
let key = "xietian";let hash1 = "eyJhbGciOiJIUzI1NiJ9.YWJjZGVm.pazQAwUB0OAO-xlF6D0sV1r-lQCPGQcGwvUWV20fiuE";
let str1 = jsonwebtoken.verify(hash1, key);
console.log(str1);

案例1:

const jsonwebtoken = require("jsonwebtoken");
// 加密
var data = { name: "kwj", age: 20 };
let hash = jsonwebtoken.sign(data, "123456");
console.log(hash);
console.log("--------------------------");
// 解密
var data1 = { name: "xietian", age: 20 };
let hash1 = jsonwebtoken.verify(hash, "123456")
console.log(hash1);

案例2:jsonwebtoken的对称解密

// 对称加密  秘钥 加密的秘钥和解密的秘钥是完全相同的
// 可以多次加密解密
const jsonwebtoken = require("jsonwebtoken");
// 加密
var data = { a: 1, b: 2 };
var hash = jsonwebtoken.sign(data, "123456");
var hash1 = jsonwebtoken.sign(hash, "123456");
console.log(hash1);
console.log("----------------------------------");
// 解密
var hash2 = jsonwebtoken.verify(hash1, "123456");
var data1 = jsonwebtoken.verify(hash2, "123456");
console.log(data1);

案例3:jsonwebtoken的非对称解密 

const jsonwebtoken = require("jsonwebtoken");
const fsp = require("fs/promises");
const path = require("path")
// 非对称加密
init();
async function init() {var data = { name: "xietian", age: 20 };var privateKey = await fsp.readFile(path.resolve("./rsa_private_key.pem"));var hash = jsonwebtoken.sign(data, privateKey, { algorithm: "RS256" })var publicKey = await fsp.readFile(path.resolve("./rsa_public_key.pem"));var data1 = jsonwebtoken.verify(hash, publicKey);console.log(data1);
}

7. cors跨域

下载命令:npm i cors -S

使用方法(固定写法) :app.use(cors())

8. 客户端版socket

连接分为长连接和短连接(客户端给服务端发消息,服务端返回消息,然后连接就断了)。

socket是一种长连接,因此需要保障每一个连接过来的客户端都被存储引用。

readline是读取终端的行消息。

引入模块:

const net = require('net');

服务端创建服务:

const server = new net.createServer();

客户端创建socket服务:

var socket = new net.Socket();

引入模块:

const readline = require("readline");

实现案例:

服务端:

1. 创建一个socketServer1文件夹,在该文件夹下打开集成终端执行npm init -y 命令初始化得到package.json文件,编写该文件。

{"name": "socketserver1","version": "1.0.0","description": "","main": "index.js","scripts": {"start": "nodemon PORT=4000 "},"keywords": [],"author": "","license": "ISC","devDependencies": {"nodemon": "^3.1.4"}
}

2. 在集成终端执行 npm i 和npm start命令。

3. 新建入口文件index.js,编写代码。

// 引入net模块
const net = require("net");
// 创建服务器(服务端)
const server = net.createServer();
// n表示连接成功的次数
let n = 0;
// 连接上的client集合
let list = {};
// server.on()方法是侦听connection事件的连接情况
server.on("connection", connnectionHandler);
// server.listen()开启端口号
server.listen(process.env.PORT);
// 侦听connection事件的函数(参数:客户端)
function connnectionHandler(client) {n++;// 相当于给进来的client取名字client.name = n;// client存入listlist[n] = client;// console.log(Object.keys(list).length);// 侦听客服端error出错事件的函数client.on("error", () => errorHandler(client));// 侦听客服端close关闭事件的函数client.on("close", () => closeHandler(client));// 侦听服务器发送数据给客户端的函数client.on("data", (msg) => getMsgHandler(msg, client))
}
// 侦听客服端发送数据的函数
function getMsgHandler(msg, client) {console.log(msg + "");for (var key in list) {list[key].write(msg + "");}
}// 侦听客服端error出错事件的函数
function errorHandler(client) {console.log(client.name + " error");// 关闭出错的client的连接client.end();
}// 侦听客服端close关闭事件的函数
function closeHandler(client) {console.log(client.name + "关闭下线了");// 关闭client的连接client.end();// 从集合中删除delete list[client.name];
}

客服端:

1. 创建一个socketClient1文件夹,在该文件夹下打开集成终端执行npm init -y 命令初始化得到package.json文件,编写该文件。

{"name": "socketclient1","version": "1.0.0","description": "","main": "index.js","scripts": {"start": "node index.js"},"keywords": [],"author": "","license": "ISC"
}

2. 新建入口文件index.js,编写代码。

// 也要引入net模块
const net = require("net");
// 读取终端行消息模块
const readline = require("readline");
// 这个代码让我们的命令行变为输入端和输出端
const order = readline.Interface({// 这里是输入端input: process.stdin,// 这里是输出端output: process.stdout
})let socket;
init();
// 初始化函数
function init() {// 客户端创建socket服务socket = new net.Socket();// 连接服务端(参数:4000的端口号,参数:域名或id地址,参数:连接成功的回调函数)socket.connect(4000, "localhost", () => {// 当连接上服务端执行这个函数// 发信息的方法一:// socket.write()方法是直接发消息给服务端// socket.write("你好");// 发信息的方法二:// order.question("输入:", (msg) => {//     // 发送的消息// })})// 侦听服务端发送回来的数据socket.on("data", (msg) => msgHandler(msg));inputShow();
}function msgHandler(msg) {console.log(msg + "");
}// 使用readline模块的方法发送消息
function inputShow() {order.question("输入:", (msg) => {socket.write("谢天说:" + msg);inputShow();})
}

9. 

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

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

相关文章

Spring Boot基础

项目创建 项目启动 请求响应 RestController 1.返回值处理 RestController&#xff1a;这个注解结合了Controller和ResponseBody的功能。它默认将所有处理请求的方法的返回值直接作为响应体内容返回&#xff0c;主要用于构建RESTful API。返回的数据格式通常是JSON或XML&…

Linux:软件包管理器 yum和编辑器-vim使用

hello&#xff0c;各位小伙伴&#xff0c;本篇文章跟大家一起学习《Linux&#xff1a;软件包管理器 yum和编辑器-vim使用》&#xff0c;感谢大家对我上一篇的支持&#xff0c;如有什么问题&#xff0c;还请多多指教 &#xff01; 如果本篇文章对你有帮助&#xff0c;还请各位点…

整流电路的有源逆变工作状态

目录 1. 逆变的概念 2. 有源逆变的条件 3. 电流电路的概念 4. 产生逆变的条件 5. 三相桥式全控整流电路的有源逆变工作状态 6. 逆变角的概念 7. 逆变失败的原因 8. 最小逆变角的限制 整流电路的有源逆变状态是指通过控制整流器&#xff0c;使其将直流电源的能量反向送回…

[乱码]确保命令行窗口与主流集成开发环境(IDE)统一采用UTF-8编码,以规避乱码问题

文章目录 一、前言二、命令行窗口修改编码为UTF-8三、Visual Studio 2022修改编码为UTF-8四、Eclipse修改编码为UTF-8五、DevCPP修改编码为UTF-8六、Sublime Text修改编码为UTF-8七、PyCharm、IDEA、VS Code及Python自带解释器修改编码为UTF-8 一、前言 在学习的征途中&#x…

close_wait状态的实例:一次 MySQL 主动关闭,导致服务出现大量 CLOSE_WAIT 的全流程排查过程【个人总结】

没有实际的操作设备和条件&#xff0c;只能看文章来体验。文章主要是通过观察实例来说明close_wait状态的问题&#xff0c;一般导致close_wait状态都不是有意的&#xff0c;而是操作不注意就会导致此问题的出现。所以在代码书写上一定要确保不会出现问题。 事件&#xff1a;so…

【变化检测】基于ChangeStar建筑物(LEVIR-CD)变化检测实战及ONNX推理

主要内容如下&#xff1a; 1、LEVIR-CD数据集介绍及下载 2、运行环境安装 3、ChangeStar模型训练与预测 4、Onnx运行及可视化 运行环境&#xff1a;Python3.8&#xff0c;torch1.12.0cu113&#xff0c;onnxruntime-gpu1.12.0 likyoo变化检测源码&#xff1a;https://github.c…

【路径规划】WDM网络中RWA问题的教育网络规划工具(基于MILP和启发式)

摘要 MatPlanWDM 是一款专用于波分复用&#xff08;WDM&#xff09;网络的规划工具&#xff0c;旨在解决波长路由与分配&#xff08;RWA&#xff09;问题。该工具结合了线性混合整数规划&#xff08;MILP&#xff09;和一系列启发式算法&#xff0c;为用户提供了多种网络规划选…

开发类似途虎养车的汽修店管理系统

在这个数字化时代&#xff0c;越来越多的传统行业开始拥抱新技术&#xff0c;以提升效率和服务质量。汽修行业也不例外&#xff0c;途虎养车凭借其强大的数字化方案&#xff0c;在行业内树立了标杆。今天&#xff0c;我们将介绍途虎养车数字化方案的优点&#xff0c;并为您呈现…

R语言xlsx,txt文件处理:以《书摘》00年-10年资源合集整理为例

偶然间读到一篇文章&#xff0c;分享06年《书摘》的内容&#xff0c;今天来看都不过时&#xff0c;所以起了找下这本老杂志合集的心思。 傅佩荣先生《哲学与人生》选段 “如果有人觉得活着很辛苦&#xff0c;面对自己又感觉无聊乏味&#xff0c;那么他应该多接触自然界。我有个…

【楚怡杯】职业院校技能大赛 “云计算应用” 赛项样题四

某企业根据自身业务需求&#xff0c;实施数字化转型&#xff0c;规划和建设数字化平台&#xff0c;平台聚焦“DevOps开发运维一体化”和“数据驱动产品开发”&#xff0c;拟采用开源OpenStack搭建企业内部私有云平台&#xff0c;开源Kubernetes搭建云原生服务平台&#xff0c;选…

TCP Analysis Flags 之 TCP ZeroWindow

前言 默认情况下&#xff0c;Wireshark 的 TCP 解析器会跟踪每个 TCP 会话的状态&#xff0c;并在检测到问题或潜在问题时提供额外的信息。在第一次打开捕获文件时&#xff0c;会对每个 TCP 数据包进行一次分析&#xff0c;数据包按照它们在数据包列表中出现的顺序进行处理。可…

图数据库的力量:深入理解与应用 Neo4j

图数据库的力量&#xff1a;深入理解与应用 Neo4j 文章目录 图数据库的力量&#xff1a;深入理解与应用 Neo4j1、什么是 Neo4j&#xff1f;版本说明 2、Neo4j 的部署和安装Neo4j Web 工具介绍 3、体验 Neo4j加载数据查询数据数据结构 4、Cypher 入门创建数据查询数据关系深度查…

new/delete和malloc/free到底有什么区别

new和malloc 文章目录 new和malloc前言一、属性上的区别二、使用上的区别三、内存位置的区别四、返回类型的区别五、分配失败的区别六、扩张内存的区别七、系统调度过程的区别总结 前言 new和malloc的知识点&#xff0c;作为一个嵌入式工程师是必须要了解清楚的。new和malloc的…

dedecms——四种webshell姿势

姿势一&#xff1a;通过文件管理器上传WebShell 步骤一&#xff1a;访问目标靶场其思路为 dedecms 后台可以直接上传任意文件&#xff0c;可以通过文件管理器上传php文件获取webshell 步骤二&#xff1a;登陆到后台点击【核心】--》 【文件式管理器】--》 【文件上传】将准备好…

47.面向对象综合训练-汽车

//题目需求&#xff1a;定义数组存储3个汽车对象 //汽车的属性&#xff1a;品牌&#xff0c;价格&#xff0c;颜色 //创建三个汽车对象&#xff0c;数据通过键盘录入而来&#xff0c;并把数据存入到数组当中 1.标准的JavaBean类 public class Car {private String brand;//品…

渗透测试入门学习——php与mysql数据库连接、使用session完成简单的用户注册、登录

关于cookie、session和sessionid&#xff1a; cookie是保存在用户浏览器的令牌&#xff0c;在用户访问网站时&#xff0c;网站可取出用户cookie中存放的内容来识别用户身份&#xff0c;用于会话的sessionid就存放其中 session是用户访问网站时&#xff0c;网站服务器为用户生…

Ubuntu 24.04中安装virtualenv

在Ubuntu 24.04中安装virtualenv&#xff0c;可以按照以下步骤进行&#xff1a; 1. 确保Python已安装‌&#xff1a; 在终端中输入python --version或python3 --version来检查Python的安装情况。 python3 --version2. 安装pip‌&#xff08;如果尚未安装&#xff09;&#x…

第159天:安全开发-Python-协议库爆破FTPSSHRedisSMTPMYSQL等

案例一: Python-文件传输爆破-ftplib 库操作 ftp 协议 开一个ftp 利用ftp正确登录与失败登录都会有不同的回显 使用ftplib库进行测试 from ftplib import FTP # FTP服务器地址 ftp_server 192.168.172.132 # FTP服务器端口&#xff08;默认为21&#xff09; ftp_po…

【Linux取经之路】Linux项目自动化构建工具-make/makefile git三板斧

目录 关于make和makefile 一个案例 make和makefile的使用 makefile的基本语法 git的使用 关于make和makefile make是 Linux 系统中广泛使用的一个自动化构建工具&#xff0c;它根据用户定义的规则&#xff08;通常保存在一个名为 makefile的文件中&#xff09;来自动编译…

Maya---机械模型制作

材质效果&#xff08;4&#xff09;_哔哩哔哩_bilibili 三角面 四边面 多边面 *游戏允许出现三角面和四边面 游戏中一般是低模&#xff08;几千个面&#xff09; 动漫及影视是高模 机械由单独零件组合而成&#xff0c;需独立制作 低面模型到高面模型 卡线是为了将模型保…