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

news2024/9/21 16:01:35

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) {
    // 获取当前文件的上一级路劲并拼接上public
    const 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开头就要添加一个https
        if (!/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存入list
    list[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.coloradmin.cn/o/2152738.html

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

相关文章

828华为云征文|华为云Flexus云服务器X实例之openEuler系统下部署Joplin笔记工具

828华为云征文&#xff5c;华为云Flexus云服务器X实例之openEuler系统下部署joplin笔记工具 前言一、Flexus云服务器X实例介绍1.1 Flexus云服务器X实例简介1.2 Flexus云服务器X实例特点1.3 Flexus云服务器X实例使用场景 二、Joplin介绍2.1 Joplin简介2.2 Joplin主要特点 三、本…

倒排索引(反向索引)

倒排索引&#xff08;Inverted Index&#xff09;是搜索引擎和数据库管理系统中常用的一种数据结构&#xff0c;用于快速检索文档集合中的文档。在全文搜索场景中&#xff0c;倒排索引是一种非常高效的手段&#xff0c;因为它能够快速定位到包含特定关键词的所有文档。 1、基本…

Java面试——集合篇

1.Java中常用的容器有哪些&#xff1f; 容器主要包括 Collection 和 Map 两种&#xff0c;Collection 存储着对象的集合&#xff0c;而 Map 存储着键值对(两个对象)的映射表。 如图&#xff1a; 面试官追问&#xff1a;说说集合有哪些类及他们各自的区别和特点&#xff1f; S…

@Mapper 和 @MapperScan

今天在学习项目的时候&#xff0c;遇到一个小问题&#xff0c;先记录下来。 Mapper 和 MapperScan 的效果是一样的 Mapper 加到对应的接口上MapperScan 则通常在一个单独的配置类中&#xff0c;在这个类中使用MapperScan声明要扫描的 mapper 接口。也就是说&#xff0c;这两个…

进程分析工具Process Explorer使用

进程分析工具Process Explorer使用 Process Explorer让使用者能了解看不到的在后台执行的处理程序&#xff0c;能显示目前已经载入哪些模块&#xff0c;分别是正在被哪些程序使用着&#xff0c;还可显示这些程序所调用的DLL进程&#xff0c;以及他们所打开的句柄。Process Expl…

MySQL-DDL/DML(数据定义/操作语言)

数据定义语言(DDL-Data Definition Language) 代表关键字:create ,drop,alter 数据操作语言(DML-Data Manipulation Language) 代表关键字&#xff1a;insert,delete,update 1、表的操作 1.1 创建表 create table 表名(字段1,字段2,字段3.....字段n) [charset字符集][type表类…

【JavaScript】LeetCode:46-50

文章目录 46 翻转二叉树47 对称二叉树48 二叉树的直径49 二叉树的层序遍历50 将有序数组转换为二叉搜索树 46 翻转二叉树 递归前序遍历 / 后序遍历&#xff0c;这里给出前序遍历的代码。遍历节点&#xff0c;交换左右子树。 /*** Definition for a binary tree node.* functio…

使用`fetch`和`async/await`进行前端数据请求:详解与优化

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119@qq.com] 📱个人微信:15279484656 🌐个人导航网站:www.forff.top 💡座右铭:总有人要赢。为什么不能是我呢? 专栏导…

群晖NAS使用Docker本地部署网页版Ubuntu系统并实现无公网IP远程访问

文章目录 前言1. 下载Docker-Webtop镜像2. 运行Docker-Webtop镜像3. 本地访问网页版Linux系统4. 群晖NAS安装Cpolar工具5. 配置异地访问Linux系统6. 异地远程访问Linux系统7. 固定异地访问的公网地址 前言 本文旨在详细介绍如何在群晖NAS部署docker-webtop&#xff0c;并结合c…

【hot100-java】【搜索旋转排序数组】

R8-二分查找篇 等等&#xff0c;不是&#xff1f;O(logn)&#xff1f;那岂不是一次遍历数组都超时了hh. 二分查找分类 class Solution {public int search(int[] nums, int target) {if (numsnull||nums.length0){return -1;}int start0;int endnums.length-1;int mid;while …

1--SpringBoot外卖项目介绍及环境搭建 详解

目录 软件开发整体流程 软件开发流程 角色分工 软件环境 苍穹外卖项目介绍 项目介绍 产品原型 技术选型 开发环境搭建 前端环境搭建 后端环境搭建 完善登录功能 导入接口文档 Swagger 介绍 使用方式 常用注解 软件开发整体流程 软件开发流程 需求分析&#x…

1、等保测评介绍

数据来源&#xff1a;等保测评基础知识学习(1.02.0)2024最新版_哔哩哔哩_bilibili 等级保护的定义&#xff1a; 对国家秘密信息、法人或其他组织及公民专有信息以及公开信息&#xff0c;按照其重要程度对信息系统实施分等级安全保护。这包括对使用的安全产品进行等级管理&…

Vue 项目实战4-无缝轮播图

养成好习惯&#xff0c;先赞后看&#xff0c;感谢对作者大大的支持 一、话不多说&#xff0c;直接上效果图&#xff1a; 完整视频展示链接如下&#xff1a; https://item.taobao.com/item.htm?ftt&id833405684191 二、实现思路 HTML结构 文档头部设置&#xff1a;定义…

TAPD 卓越版

一、版本概述 TAPD 卓越版提供 项目协同生态管理 解决方案&#xff0c;适合小团队轻量协作。TAPD 卓越版在专业版基础上增加任务、甘特图、协公协同模块三大应用&#xff0c;同时项目数上限增加至200个&#xff0c;能够帮助团队更高效协作、快速沟通&#xff0c;实时管理工作进…

京东方数字化研发部部长吕志超受邀为第四届中国项目经理大会演讲嘉宾

全国项目经理专业人士年度盛会 京东方科技集团数字化研发部部长吕志超先生受邀为PMO评论主办的全国项目经理专业人士年度盛会——2024第四届中国项目经理大会演讲嘉宾&#xff0c;演讲议题为“项目经理的领导力破局之路”。大会将于10月26-27日在北京举办&#xff0c;主题为&am…

力扣之182.查找重复的电子邮箱

文章目录 1. 182.查找重复的电子邮箱1.1 题干1.2 准备数据1.3 解法1.4 结果截图 1. 182.查找重复的电子邮箱 1.1 题干 表: Person -------------------- | Column Name | Type | -------------------- | id | int | | email | varchar | -------------------- id 是该表的主…

2024华为杯研赛D题分析

2024华为杯研究生数学建模D题分析如下&#xff0c;完整版本在文末名片

常见排序(C语言版)

1.排序的概念及其应用 1.1排序的概念 排序&#xff1a;​ 在计算机科学与数学中&#xff0c;一个排序算法&#xff08;英语&#xff1a;Sorting algorithm&#xff09;是一种能将一串资料依照特定排序方式排列的算法。 稳定性&#xff1a;假定在待排序的记录序列中&#xff…

Linux基础3-基础工具4(git),冯诺依曼计算机体系结构

上篇文章&#xff1a;Linux基础3-基础工具3&#xff08;make,makefile,gdb详解&#xff09;-CSDN博客 本章重点&#xff1a; 1. git简易使用 2. 冯诺依曼计算机体系结构介绍 目录 一. git使用 1.1 什么是git? 1.2 git发展史 1.3 git创建仓库 1.4 git命令操作 二. 冯诺依…

基于Pytorch框架的深度学习MODNet网络精细人像分割系统源码

第一步&#xff1a;准备数据 人像精细分割数据&#xff0c;可分割出头发丝&#xff0c;为PPM-100开源数据 第二步&#xff1a;搭建模型 MODNet网络结构如图所示&#xff0c;主要包含3个部分&#xff1a;semantic estimation&#xff08;S分支&#xff09;、detail prediction…