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.xdnf.cn/news/143117.html

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

相关文章

『功能项目』窗口可拖拽脚本【59】

本章项目成果展示 我们打开上一篇58第三职业弓弩的平A的项目&#xff0c; 本章要做的事情是给坐骑界面挂载一个脚本让其显示出来的时候可以进行拖拽 创建脚本&#xff1a;DraggableWindow.cs using UnityEngine; using UnityEngine.EventSystems; public class DraggableWindo…

Tesseract:在线高性能表结构变更方法(VLDB23)

文章目录 背景表结构变更的必要性现有技术的不足Tesseract&#xff08;超立方体&#xff09;&#xff1a;一种在MVCC系统中支持非阻塞、事务性的表结构变更的方法动机 基础的DDaM&#xff08;被作为数据修改的数据定义&#xff09;对DDL操作的分类的两个维度表结构版本&#xf…

探索未来游戏边界:AI驱动的开放世界RPG引擎与UGC平台

在游戏产业的浩瀚星空中,一项革命性的技术正悄然升起,它不仅重塑了游戏开发的传统模式,更将玩家的创造力推向了前所未有的高度。今天,让我们一同走进这个由AI驱动的开放世界RPG游戏引擎与UGC(用户生成内容)平台的奇幻世界,探索其背后的无限可能。 产品定位:AI赋能,重…

信息安全工程师(8)网络新安全目标与功能

前言 网络新安全目标与功能在当前的互联网环境中显得尤为重要&#xff0c;它们不仅反映了网络安全领域的最新发展趋势&#xff0c;也体现了对网络信息系统保护的不断加强。 一、网络新安全目标 全面防护与动态应对&#xff1a; 目标&#xff1a;建立多层次、全方位的网络安全防…

《沈阳体育学院学报》

《沈阳体育学院学报》创刊于1982年&#xff0c;是由沈阳体育学院主办&#xff0c;面向国内外公开发行的体育类学术期刊&#xff1b;国际标准刊号为ISSN 1004-0560&#xff0c;国内刊号为CN 21-1081/G8&#xff1b;双月刊&#xff0c;单月中旬出版。 《沈阳体育学院学报》是中文…

使用CUBE_MX使用I2C通信,实现对EEPROM的读写

一、使用CUBE_MX配置 1.配置I2C 2.配置USART1 3.重中之重(在KEIL5打开串口使用的库) 二、KEIL5配置 #include "main.h" #include "i2c.h" #include "gpio.h" #include "usart.h"#include <stdio.h>void SystemClock_Config(vo…

【他山之石】优化 JavaScript 的乐趣与价值(上)

前言 这是前几天偶然看到的一篇硬核推文。作者一口气分了 12 个主题探讨了 JavaScript 在优化时应该注意的要点&#xff0c;读后深受启发。由于篇幅较长&#xff0c;分两篇发表。本篇为上篇。 文章目录 Optimizing Javascript for fun and for profit0. Avoid work1. Avoid str…

苍穹外卖Day01-2

导入接口文档 yApi接口管理平台http://api.doc.jiyou-tech.com/ 创建项目 导入接口文件 导入结果界面 Swagger 介绍 使用Swagger你只需要按照它的规范去定义接口及接口相关的信息&#xff0c;就可以做到生成接口文档&#xff0c;以及在线接口调试页面。 官网&#xff1a;ht…

redis群集三种模式:主从复制、哨兵、集群

redis群集有三种模式 redis群集有三种模式&#xff0c;分别是主从同步/复制、哨兵模式、Cluster&#xff0c;下面会讲解一下三种模式的工作方式&#xff0c;以及如何搭建cluster群集 ●主从复制&#xff1a;主从复制是高可用Redis的基础&#xff0c;哨兵和集群都是在主从复制…

【运行】错误分析error: stray ‘\302’ 和 error: stray ‘\240’

您遇到的编译错误主要是由于代码中出现了不受支持的字符&#xff0c;例如 UTF-8 编码下的不可见字符。这通常是由于在代码中使用了特定的空格或格式化字符。 错误分析 error: stray ‘\302’ 和 error: stray ‘\240’ 提示您在文件中发现了无法识别的字符&#xff0c;通常是因…

常耀斌:AI赋能企业数字化转型(清华社发行)

新书地址&#xff1a; 清华出版社&#xff1a;清华大学出版社-图书详情-《AI赋能企业数字化转型》 京东&#xff1a;《AI赋能企业数字化转型 常耀斌 清华大学出版社 9787302669081》【摘要 书评 试读】- 京东图书 内容简介&#xff1a; 在数字经济时代&#xff0c;企业发…

VMware Tools系列三:图解安装完成VMware Tools测试

一、 VMware Tools测试安装是否成功 1. 菜单项检查 VMware Tools 是否已安装&#xff1a; 在 VMware Workstation 中&#xff0c;查看虚拟机的菜单栏&#xff0c;通常在“虚拟机”菜单下会有“重新安装 VMware Tools”的选项&#xff0c;说明 VMware Tools 已经安装。如图所示…

网络设备登录——《路由与交换技术》实验报告

目录 一、实验目的 二、实验设备和环境 三、实验记录 1.通过 Console 登录 步骤1:连接配置电缆。 步骤2:启动PC,运行超级终端。 步骤3:进入Console 配置界面 2.通过 Telnet 登录 步骤1:通过 Console 接口配置 Telnet 用户。 步骤2:配置 super 口令 步骤3:配置登录欢迎…

动手学深度学习(pytorch)学习记录31-批量规范化(batch normalization)[学习记录]

目录 批量规范化&#xff08;batch normalization&#xff09;从头开始实现一个具有张量的批量规范化层简明实现 批量规范化&#xff08;batch normalization&#xff09; 可持续加速深层网络的的收敛速度。再结合残差块&#xff0c;批量规范化使得研究人员可以训练100层以上的…

Java项目实战II基于Java+Spring Boot+MySQL的校园社团信息管理系统(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、论文参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在当今高校…

回归预测|2024年2月最新优化算法角蜥优化HLOA|基于角蜥优化BP神经网络数据回归Matlab程序HLOA-BP【优化效果好】

回归预测|2024年2月最新优化算法角蜥优化HLOA|基于角蜥优化BP神经网络数据回归Matlab程序HLOA-BP【优化效果好】 文章目录 一、基本原理1. 角蜥优化算法&#xff08;HLOA&#xff09;简介2. BP 神经网络&#xff08;BP Neural Network&#xff09;简介3. HLOA-BP 回归预测流程总…

Qt开发技巧(四)“tr“使用,时间类使用,Qt容器取值,类对象的删除,QPainter画家类,QString的转换,用好 QVariant类型

继续讲一些Qt技巧操作 1.非必要不用"tr" 如果程序运行场景确定是某一固定语言&#xff0c;就不需要用tr,"tr"之主要针对多语种翻译的&#xff0c;因为tr的本意是包含英文&#xff0c;然后翻译到其他语言比如中文&#xff0c;不要滥用tr&#xff0c;如果没有…

[Python数据可视化]Plotly Express: 地图数据可视化的魅力

在数据分析和可视化的世界中&#xff0c;地图数据可视化是一个强大而直观的工具&#xff0c;它可以帮助我们更好地理解和解释地理数据。Python 的 Plotly Express 库提供了一个简单而强大的方式来创建各种地图。本文将通过一个简单的示例&#xff0c;展示如何使用 Plotly Expre…

FastAdmin CMS 操作手册

FastAdmin CMS 操作手册 概述&#xff1a; 安装&#xff1a; 配置&#xff1a; 模板&#xff1a; 模板目录&#xff1a; 标签&#xff1a; 全局&#xff1a; 文章&#xff1a; 专题&#xff1a; 栏目&#xff1a; 公共参数&#xff1a; 单页&#xff1a; 特殊标签&#xff1a;…

macOS平台TextRank环境配置

1.安装python 2.安装numpy: pip3 install numpy 3.安装networkx: pip3 install networkx 4.安装math2: pip3 install math2 math2安装成功