手机号注册网站/代刷网站推广快速
一、模块化规范
nodejs使用的模块化规范 叫做 common.js 规范:
每一个模块都有独立的作用域 代码在各自模块中执行 不会造成全局污染
每一个模块都是一个独立的文件(module对象)
模块可以被多次加载(module.exports 属性) 但是仅在第一次加载时执行一次
运行结果会被缓存 如果再次加载会从缓存中获得结果
模块的加载顺序和代码的书写顺序有关// exports对象是module对象的属性,包含导出的信息
导出:module.exports ={} // module.exports.a = a || exports.a = a;默认指向以module.exports为准
导入:count a = require(''); //只有自定义模块需要写路径('./index'),导入对象永远是module.exports指向的对象
二、HTTP模块
HTTP模块
//导入模块
const http = require("http");
const https = require("https");//创建服务
let server = http.createServer((req, res) => {// request:解析客户端的请求//常用属性及方法:url(请求路径) method(请求方法)headers(头部)//url:请求的路径,可以根据URL设置出路由模式,express的就是基于此设置的//methoe:请求的方式分为,post get delete put patch//headers: 请求的头部,客户单的cookie,数据传输的类型等都放在header中//data事件:createServer想要获取请求数据体需要监听data事件//response:相应客户端请求,常用属性及方法如下://end:res.end()//setHeader(name,content),可以设置单个header属性,可以多次设置//destory:取消返回//statusCode:设置返回的状态码,如200 404 400 500等//statusMessage:设置状态码对应返回的信息//writeHead:可以同时设置statusCode statusMessage 和多个header属性res.writeHead(200, { "content-type": "text/html;charset=utf-8" });let data = ""; // 返回数据// 根据不同的请求类型 设置不同的响应头switch (req.method) {case "GET":// data事件流 接收到数据时触发的事件 参数 chunk 数据块,在函数内是将数据块拼接给datahttps.get("www.baidu.com", (res) => {res.on("data", (chunk) => (data += chunk));// end事件 在数据响应结束时触发res.on("end", () => {data = querystring.parse(data);// 接口路由设置 (后端数据接口)switch (req.url) {case "/users":console.log("获取用户信息");break;case "/addUser":// 将数据写入数据库data.add = true;res.end(JSON.stringify(data));break;case "/weather":weather(res);}});});break;case "POST":const options = {hostname: "",port: "443",path: "",method: "POST",headers: {"content-type": "application/json",},};https.request(options, (res) => {res.on("data", (chunk) => (data += chunk));// end事件 在数据响应结束时触发res.on("end", () => {data = querystring.parse(data);console.log(daat);});});req.write(JSON.stringify({ name: "", age: "" })); // 发送的请求数据req.end();break;default:}
});
//监听3000端口,开启服务
server.listen(3000, () => {console.log("打开了3000端口");
});
jsonp跨域
const http = require("http");
const url = require("url");//创建服务
http.createServer((req, res) => {res.writeHead(200, { "content-type": "text/html;charset=utf-8" });if (req.url === "/favicon.ico") return;const urlObj = url.parse(req.url, true);res.end(`${urlObj.query.callback}(${JSON.stringify({name: "xiaoming",age: 18,})})`); // 返回一个函数 fn( ${urlObj.query.callback} ) 与前端定义的 fn 名称一致}).listen(3000, () => {console.log("打开了3000端口");});
cors头跨域
const http = require("http");//创建服务
http.createServer((req, res) => {res.writeHead(200, {"content-type": "application/json;charset=utf-8","access-control-allow-origin": "*", // 跨域});res.end(JSON.stringify({name: "xiaoming",age: 18,})); // 返回一个函数 fn( ${urlObj.query.callback} ) 与前端定义的 fn 名称一致}).listen(3000, () => {console.log("打开了3000端口");});
三、URL模块
parse模块
const http = require("http");
const url = require("url");//创建服务
let server = http.createServer((req, res) => {res.writeHead(200, { "content-type": "text/html;charset=utf-8" });if (req.url === "/favicon.ico") return;console.log(url.parse(req.url, true)); // 接收第二个参数,为true则转化query对象// =Url {// protocol: null,// slashes: null,// auth: null,// host: null,// port: null,// hostname: null,// hash: null,// search: '?user=b&age=18',// query: [Object: null prototype] { user: 'b', age: '18' },// pathname: '/api',// path: '/api?user=b&age=18',// href: '/api?user=b&age=18'// }res.end();
});
//监听3000端口,开启服务
server.listen(3000, () => {console.log("打开了3000端口");
});
format模块
const url = require("url");
const urlObj= {protocol: 'https',slashes: true,auth: null,host: 'www.baidu.com:443',port: 443,hostname: 'www.baidu.com',hash: '#tag=110',search: '?user=b&age=18',query: { user: 'b', age: '18' },pathname: '/api',path: '/api?user=b&age=18',}
url.format(urlObj) => https://www.baidu.com:443/api?user=b&age=18#tag=110
resolve模块
url.resolve('/one/two','three') => '/one/three'
url.resolve('/one/two/','three') => '/one/two/three'
url.resolve('http://www.baidu.com/a/b/c','d') => 'http://www.baidu.com/d'
新url模块
const http = require("http");let server = http.createServer((req, res) => {res.writeHead(200, { "content-type": "text/html;charset=utf-8" });if (req.url === "/favicon.ico") return;const newUrl = new URL(req.url, "http://localhost:3000");console.log(newUrl);// URL {// href: 'http://localhost:3000/api?user=b&age=18',// origin: 'http://localhost:3000',// protocol: 'http:',// username: '',// password: '',// host: 'localhost:3000',// hostname: 'localhost',// port: '3000',// pathname: '/api',// search: '?user=b&age=18',// searchParams: URLSearchParams { 'user' => 'b', 'age' => '18' }, // 可迭代对象// hash: ''// }res.end();
});server.listen(3000, () => {console.log("打开了3000端口");
});
四、querystring模块
const queryatring = require("querystring");const str = "name=abc&age=18&location=shanghai";
const obj = {name: "abc",age: "18",location: "shanghai",
};// 将query格式转成对象 querystring.parse(str);
// => [Object: null prototype] {
// name: 'abc',
// age: '18',
// location: 'shanghai'
// }// 将对象转成query格式字符串 querystring.stringify(obj);
// => "name=abc&age=18&location=shanghai"
五、爬虫模块
cheerio模块
cheerio模块为Node.js 爬虫第三方模块,内置jq基本操作 // npm i cheerio
//加载数据(网页),进行元素操作
let $ = cheerio.load(rawData);
六、path模块
console.log(__dirname); // 当前目录 绝对路径
console.log(__filename); // 当前文件 绝对路径
拼接路径:
path.join(path):path.join('__dirname,'a','b'); //拼接当前文件绝对路径
获得文件后缀:
path.extname(path)
获得路径名:
path.dirname(path)
七、event模块
//导入模块
const EventEmitter = require("events");const event = new EventEmitter();event.on("start", (data) => {console.log("触发了");console.log(data);
});setTimeout(() => {event.emit("start", "开始");
}, 2000);
八、fs模块
//导入模块
count fs = require('fs');
//读取文件
fs.readFile(url,'utf8',(err,data)=>{if (err) throw err;
})
//写入文件
fs.writeFile(file,data[,options],callback)
//文件追加
fs.appendFile(file,data[,options],callback)
//修改文件名
fs.rename(oldpath,newpath,callback)
//读取目录
fs.readdir(path[,option],callback(err,files))
九、mysql模块
连接池文件:
const mysql = require('mysql');
var pool = mysql.createPool({ // 创建连接池connectionLimit: 10,host: 'localhost',user: 'root',password: 'root',database: 'h5_2013'
});
module.exports = pool; //导出模块文件2:
const mysql = require('pool'); //引入导出的配置
执行sql语句:mysql.query('select * from users', (err, data) =>
{ // 查数据if (err) console.log(err);res.send(data); // 发送查询到的数据
});
十、jwt模块
token 令牌
它是一个三段式的加密字符串
xxxxxxxxxx.yyyyyyyyyyyyyyyy.zzzzzzz
第一段: 头信息 签证:安全信息验证 口令 使用不可逆的哈希算法进行加密
第二段: 你需要存储的信息 采用base64 可逆加密 截取一部分
第三段: 额外信息 使用不可逆哈希算法进行加密
浏览器在发送请求进行登陆时
服务器验证完信息 信息正确 则生产一个 token
服务器将这个token发送给前端 前端进行存储
如果前端请求了需要验证登录权限的页面或数据 前端将token跟随请求发回后端
后端通过解密 验证token的有效性const jwt = require('jsonwebtoken');// 生成 token:
// jwt.sign(存储的数据,口令,参数);
// 口令 是一个验证需要的 额外字符串
// 解码token的时候 如果口令不同就无法正确解码// 解码token:
// jwt.verify(token,口令,回调);let userInfo = {username: 'zhangsan',age: 25,sex: 'nan',phone: 13688888888
};// 生成token
let token = jwt.sign(userInfo, 'rootbk', { expiresIn: 60 }); //expiresIn 过期时间// console.log(token);// 解码token
jwt.verify(token, 'rootbk', (err, data) => {if (err) console.log(err.message);console.log(data);
})
十一、项目脚手架express
安装
#你可以通过 npx (包含在 Node.js 8.2.0 及更高版本中)命令来运行 Express 应用程序生成器。
$ npx express-generator
#对于较老的 Node 版本,请通过 npm 将 Express 应用程序生成器安装到全局环境中并执行即可。
$ npm install -g express-generator
$ express name
#然后安装所有依赖包:
$ cd myapp
$ npm install
#然后在浏览器中打开 http://localhost:3000/ 网址就可以看到这个应用了,通过生成器创建的应用一般都有如下目录结构:- 项目名- [bin] # 存放可执行程序- www # 开启http服务- [public] # 存放静态前端文件- [images]- [javascripts]- [stylesheet]- [routes] # 存放路由文件- index.js- users.js- [views] # 前端视图模板- error.ejs- index.ejs- app.js # 主程序- package.json # 依赖信息
处理数据
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
搭建静态web服务
const express = require('express'); // 引入第三方模块的方式和引入内置模块的方式相同
const path = require('path');
const app = express(); // 创建一个express应用
const conf = {port: 8888,host: '10.31.168.73'
};
// 使用express搭建一个静态的web服务器// 静态服务器 使用一个中间件实现
// 将public目录 设置成静态的web目录
// public中所有内容都可以在web服务中被访问// app.use() 使用中间件
app.use(express.static(path.join(__dirname, 'public'))); // 静态服务app.listen(conf.port, conf.host, () => { // 监听端口启动服务console.log(`server is running at http://${conf.host}:${conf.port}`);
});
api服务
// 搭建一个api 服务 应用程序接口
// express可以快速搭建api服务
// 接口的作用是给前端提供数据支持(CRUD)
// 前端如何发送请求
// ajax get/post
// href get
// form get/post
// jsonp getconst express = require('express');
const app = express(); // 创建一个express应用
const conf = {port: 8088,host: 'localhost'
};// app.get(url,callback); 用于接受get请求
// 参数
// url[string] 请求路径
// callback[function] 回调函数
// 回调参数
// req request
// res response
// next 函数 交出中间的控制权 将这个请求交给下一个中间件app.get('/getItem', (req, res, next) => {console.log('我收到了一个请求');// 响应内容// res.send() 发送数据 接受一个字符串作为参数 发送数据后自动终止请求// res.send('hahaha');// res.send({ username: 'zhangsan', age: 20 });// res.json() 发送数据 接受一个JSON 发送后自动终止请求res.json({ data:{username: 'zhangsan', age: 20},status:success });
});
app.get('/getuser', (req, res, next) => {res.json({ username: 'lisi', age: 20, success: 1 });
});
app.post('/getuser', (req, res, next) => {res.json({ username: 'xiaoming', age: 20, success: 1 });
});
app.listen(conf.port, conf.host, () => {console.log(`server is running at http://${conf.host}:${conf.port}`);
});
use中间件
const express = require('express');
const path = require('path');
const app = express();
const conf = {port: 8888,host: 'localhost'
};
// 配置静态web服务器
app.use(express.static(path.join(__dirname, 'public')));// express 封装的是 http 服务器
// express 接受到前端发送过来的请求 会交给 中间件 依次处理// 当前回调函数就是我的自定义中间件
app.use((req, res, next) => {console.log('我是中间件一号');// 如果在中间中没有使用 send 或 json 结束请求// 这个请求会被认为没有完成 进程将被挂起// next 调用next可以将中间件的控制权交出 // 将这个请求传递给下一个中间件next();// res.send('hahah');
});
app.use((req, res, next) => {console.log('我是中间件二号');next();
});
app.listen(conf.port, conf.host, () => {console.log(`server is running at http://${conf.host}:${conf.port}`);
});
request模块-实现跨源请求(代理)
const express = require('express');
const request = require('request');
const querystring = require('querystring');
const app = express();
let requestUrl = 'http://api.k780.com/?';
let props = {app: 'weather.future',cityNm: '杭州',appkey: '38926',sign: 'f8b4121c2d581be2623569b24f798dee',format: 'json'
}
requestUrl += querystring.stringify(props);
app.get('/api', (req, res, next) => {request(requestUrl, (err, response, body) => {if (err) console.log(err);res.send(body);});
});
app.listen(8877, 'localhost', () => {console.log('start');
});
相关文章:

Node.js学习指南
一、模块化规范 nodejs使用的模块化规范 叫做 common.js 规范: 每一个模块都有独立的作用域 代码在各自模块中执行 不会造成全局污染 每一个模块都是一个独立的文件(module对象) 模块可以被多次加载(module.exports 属性) 但是仅…...

2.5学习总结
今天看了二叉树,看的一脸懵,写了两道题 P4913:二叉树深度 #include <stdio.h> #include <stdlib.h> struct hly {int left;int right; }tree[1000005]; int hulingyun(int x) {if(x0)return 0;return 1max(hulingyun(tree[x].le…...

java进阶文章链接
java 泛型:java 泛型详解-绝对是对泛型方法讲解最详细的,没有之一 Java 泛型,你了解类型擦除吗? java 注解:深入理解Java注解类型 秒懂,Java 注解 (Annotation)你可以这样学 jav…...

vue2+vue3 HMCXY基础入门
vue2vue3 HMCXY基础入门 一、Vue2.x技术精讲1.Vue快速上手(1)Vue概念(2)创建实例(3)插值表达式(4)响应式特性(5)开发者工具 2.Vue指令二、Vue3.x技术精讲 一、…...

一次线程数超限导致的hive写入hbase作业失败分析
1.集群配置 操作系统:SuSe操作系统 集群节点:100台相同配置的服务器 单台:核心112Core,内存396G 2.问题现象 现象1:跑单个入库任务报错,批量提交任务后出现OOM异常 执行12个hivesql,将数据写入hbase.hbase入库有近一半的任务报错。 每次报错的任务不是同一个,hivesql…...

ip属地是手机号还是手机位置?一文理清
在数字化和网络化的今天,IP属地这一概念逐渐成为了人们关注的焦点。特别是在社交媒体和在线平台上,IP属地的显示往往让人联想到用户的地理位置。然而,关于IP属地到底与手机号还是手机位置有关,却存在着不少误解和混淆。本文将深入…...

查看设备uuid
在大多数操作系统中,可以通过不同的方式来查看设备的 UUID(Universally Unique Identifier)。以下是一些常见的方法: 在Linux系统中,可以使用命令行工具blkid或lsblk来查看设备的 UUID。例如,执行以下命令…...

C_C++输入输出(下)
C_C输入输出(下) 用两次循环的问题: 1.一次循环决定打印几行,一次循环决定打印几项 cin是>> cout是<< 字典序是根据字符在字母表中的顺序来比较和排列字符串的(字典序的大小就是字符串的大小)…...

All in one 的 AI tool Chain “Halomate”
这不算广告啊,就是真好用,虽然是我哥们儿的产品 比如你定了个gpt的plus 订阅,你发现好像有挺多功能 1- chat,这个自不必说,必须的功能 2- 高级语音 现在变成学英语的了,实时视频也就是我过年给姑婶介绍是…...

crewai框架第三方API使用官方RAG工具(pdf,csv,json)
最近在研究调用官方的工具,但官方文档的说明是在是太少了,后来在一个视频里看到了如何配置,记录一下 以PDF RAG Search工具举例,官方文档对于自定义模型的说明如下: 默认情况下,该工具使用 OpenAI 进行嵌…...

脉冲信号傅里叶变换与频域分析:从计算到理解
摘要 本文聚焦于脉冲信号的傅里叶变换,详细推导了矩形脉冲信号和单边指数信号的傅里叶变换过程,深入解释了傅里叶变换结果 F ( ω ) F(\omega) F(ω) 的内涵,包括其定义、物理意义、包含的信息以及在实际应用中的重要性。旨在帮助读者全面掌…...

6.【BUUCTF】[SUCTF 2019]CheckIn
打开题目页面如下 看样子是一道有关文件上传的题 上传一句话木马 显示:非法后缀! 看来.php后缀被过滤了 上传一张带有木马的照片 在文件地址处输入cmd 输入以下代码执行 copy 1.jpg/b4.php/a 5.jpg 最后一行有一句话木马 上传带有木马的图片 但其实…...

基于springboot的体质测试数据分析及可视化设计
作者:学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等 文末获取“源码数据库万字文档PPT”,支持远程部署调试、运行安装。 项目包含: 完整源码数据库功能演示视频万字文档PPT 项目编码࿱…...

孟加拉国_行政边界省市边界arcgis数据shp格式wgs84坐标
这篇内容将深入探讨孟加拉国的行政边界省市边界数据,该数据是以arcgis的shp格式提供的,并采用WGS84坐标系统。ArcGIS是一款广泛应用于地理信息系统(GIS)的专业软件,它允许用户处理、分析和展示地理空间数据。在GIS领域…...

可视化相机pose colmap形式的相机内参外参
目录 内参外参转换 可视化相机pose colmap形式的相机内参外参 内参外参转换 def visualize_cameras(cameras, images):fig plt.figure()ax fig.add_subplot(111, projection3d)for image_id, image_data in images.items():qvec image_data[qvec]tvec image_data[tvec]#…...

数据结构 树2
文章目录 前言 一,二叉搜索树的高度 二,广度优先VS深度优先 三,广度优先的代码实现 四,深度优先代码实现 五,判断是否为二叉搜索树 六,删除一个节点 七,二叉收索树的中序后续节点 总结 …...

GB/T 44721-2024 与 L3 自动驾驶:自动驾驶新时代的基石与指引
1.前言 在智能网联汽车飞速发展的当下,自动驾驶技术成为了行业变革的核心驱动力。从最初的辅助驾驶功能,到如今不断迈向高度自动化的征程,每一步都凝聚着技术的创新与突破。而在这一进程中,标准的制定与完善对于自动驾驶技术的规…...

AURIX TC275学习笔记3 官方例程 (UART LED WDT)
文章目录 参考资料1. ASCLIN_UART_12. GPIO_LED_Button_13. WDT (Watch Dog Timer) 参考资料 AURIX TC275学习笔记1 资料收集Getting Started with AURIX™ Development Studio 官方帮助文档happy hacking for TC275! 硬件平台使用AURIX™ TC275 Lite 套件,按照参…...

Vim的基础命令
移动光标 H(左) J(上) K(下) L(右) $ 表示移动到光标所在行的行尾, ^ 表示移动到光标所在行的行首的第一个非空白字符。 0 表示移动到光标所在行的行首。 W 光标向前跳转一个单词 w光标向前跳转一个单词 B光标向后跳转一个单词 b光标向后跳转一个单词 G 移动光标到…...

Linux的简单使用和部署4asszaaa0
一.部署 1 环境搭建方式主要有四种: 1. 直接安装在物理机上.但是Linux桌面使用起来非常不友好.所以不建议.[不推荐]. 2. 使用虚拟机软件,将Linux搭建在虚拟机上.但是由于当前的虚拟机软件(如VMWare之类的)存在⼀些bug,会导致环境上出现各种莫名其妙的问题比较折腾.[非常不推荐…...

Linux 的 sysfs 伪文件系统介绍【用户可以通过文件操作与内核交互(如调用内核函数),而无需编写内核代码】
1. 什么是 sysfs伪文件系统? sysfs 是 Linux 内核提供的 伪文件系统,用于向用户空间暴露内核对象的信息和控制接口。它是 procfs 的补充,主要用于管理 设备、驱动、内核子系统 等信息,使用户可以通过文件操作(如用户空…...

每日一题洛谷P5721 【深基4.例6】数字直角三角形c++
#include<iostream> using namespace std; int main() {int n;cin >> n;int t 1;for (int i 0; i < n; i) {for (int j 0; j < n - i; j) {printf("%02d",t);t;}cout << endl;}return 0; }...

计算机网络笔记再战——理解几个经典的协议1
目录 前言 从协议是什么出发 关于TCP/IP协议体系 几个传输方式的分类 地址 网卡 中继器(Repeater) 网桥(Bridge) 路由器(Router) 网关 前言 笔者最近正在整理(笔者开的坑不少…...

ElasticSearch学习笔记-解析JSON格式的内容
如果需要屏蔽其他项目对Elasticsearch的直接访问操作,统一由一个入口访问操作Elasticsearch,可以考虑直接传入JSON格式语句解析执行。 相关依赖包 <properties><elasticsearch.version>7.9.3</elasticsearch.version><elasticsea…...

浅谈密码相关原理及代码实现
本代码仅供学习、研究、教育或合法用途。开发者明确声明其无意将该代码用于任何违法、犯罪或违反道德规范的行为。任何个人或组织在使用本代码时,需自行确保其行为符合所在国家或地区的法律法规。 开发者对任何因直接或间接使用该代码而导致的法律责任、经济损失或…...

Spring Boot常用注解深度解析:从入门到精通
今天,这篇文章带你将深入理解Spring Boot中30常用注解,通过代码示例和关系图,帮助你彻底掌握Spring核心注解的使用场景和内在联系。 一、启动类与核心注解 1.1 SpringBootApplication 组合注解: SpringBootApplication Confi…...

can not add outlook new accounts on the outlook
link : Reference url...

私有化部署 DeepSeek + Dify,构建你的专属私人 AI 助手
私有化部署 DeepSeek Dify,构建你的专属私人 AI 助手 概述 DeepSeek 是一款开创性的开源大语言模型,凭借其先进的算法架构和反思链能力,为 AI 对话交互带来了革新性的体验。通过私有化部署,你可以充分掌控数据安全和使用安全。…...

【Elasticsearch】post_filter
post_filter是 Elasticsearch 中的一种后置过滤机制,用于在查询执行完成后对结果进行过滤。以下是关于post_filter的详细介绍: 工作原理 • 查询后过滤:post_filter在查询执行完毕后对返回的文档集进行过滤。这意味着所有与查询匹配的文档都…...

验证工具:GVIM和VIM
一、定义与关系 gVim:gVim是Vim的图形界面版本,提供了更多的图形化功能,如菜单栏、工具栏和鼠标支持。它使得Vim的使用更加直观和方便,尤其对于不习惯命令行界面的用户来说。Vim:Vim是一个在命令行界面下运行的文本编…...