Node.js学习指南

一、模块化规范

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');
});

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

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

相关文章

98.2 AI量化开发:基于DeepSeek打造个人专属金融消息面-AI量化分析师(理论+全套Python代码)

目录 0. 承前1. 金融工程结构图2. Why is DeepSeek3. 项目实现代码3.1 导入python库3.2 参数设置3.3 获取数据3.4 数据处理3.5 AI人设提示词3.6 Messages构建3.7 AI Agent3.8 response格式处理3.9 汇总函数3.10 运行案例 4. 总结4.1 系统优点4.2 系统缺点4.3 可提升方向 0. 承前…

用python实现进度条

前言 在Python中,可以使用多种方式实现进度条。以下是几种常见的进度条格式的实现方法: 1. 使用 tqdm 库 tqdm 是一个非常流行的库,可以轻松地在循环中显示进度条。 from tqdm import tqdm import time# 示例:简单的进度条 fo…

Java 大视界 -- 深度洞察 Java 大数据安全多方计算的前沿趋势与应用革新(52)

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

【蓝桥杯嵌入式】LED

1、电路图 74HC573是八位锁存器,当控制端LE脚为高电平时,芯片“导通”,LE为低电平时芯片“截止”即将输出状态“锁存”,led此时不会改变状态,所以可通过led对应的八个引脚的电平来控制led的状态,原理图分析…

Vue.js组件开发-实现广告图片浮动随屏幕滚动

实现步骤 创建 Vue 项目:使用 Vue CLI 快速搭建一个新的 Vue 项目。编写 HTML 结构:在 Vue 组件中定义广告图片的 HTML 结构。添加 CSS 样式:设置广告图片的初始样式和浮动效果。添加 JavaScript 逻辑:监听窗口滚动事件&#xff…

苹果再度砍掉AR眼镜项目?AR真的是伪风口吗?

曾经,AR游戏一度异常火热,宝可梦go让多少人不惜翻墙都要去玩,但是也没过去几年,苹果被曝出再度砍掉了AR眼镜项目,面对着市场的变化,让人不禁想问AR真的是伪风口吗? 一、苹果再度砍掉AR眼镜项目&…

关于deepseek的一些普遍误读

最近deepseek成为全球最热门的话题,甚至没有之一,无论是北美,欧洲,各大IT巨头,各个投资机构,政府官员,乃至脱口秀演员,都在不断提及这个话题,而国内,自媒体也…

Vue 3 30天精进之旅:Day 15 - 插件和指令

欢迎来到“Vue 3 30天精进之旅”的第15天!今天我们将深入探讨Vue 3中的插件和自定义指令。这两个主题能够帮助我们扩展Vue的功能,使我们的应用更加灵活和强大。 一、插件概述 1. 什么是插件? 在Vue中,插件是一种功能扩展机制。…

PostgreSQL 数据库备份与还原

为了安全与数据共享等,创建好的数据库有时候需要备份操作和还原操作。数据库的备份与还原主要是三个命令:pg_dump、pg_dumpall 和 pg_restore 。 其中pg_dump用于备份单个数据库,它支持多种备份格式(SQL、自定义等)&a…

排序算法--计数排序

唯一种没有比较的排序(指没有前后比较,还是有交换的)。统计每个元素出现的次数,直接计算元素在有序序列中的位置,要求数据是整数且范围有限。适用于数据为小范围整数(如年龄、成绩),数据重复率较高时效率更优。可用于小…

Ubuntu重启搜狗输入法

Ubuntu的搜狗输入法重启_ubuntu sogou reset-CSDN博客 # fictx自带的重启 fcitx -r

C#结合html2canvas生成切割图片并导出到PDF

目录 需求 开发运行环境 实现 生成HTML范例片断 HTML元素转BASE64 BASE64转图片 切割长图片 生成PDF文件 小结 需求 html2canvas 是一个 JavaScript 库,它可以把任意一个网页中的元素(包括整个网页)绘制到指定的 canvas 中&#xf…

java进阶专栏的学习指南

学习指南 java类和对象java内部类和常用类javaIO流 java类和对象 类和对象 java内部类和常用类 java内部类精讲Object类包装类的认识String类、BigDecimal类初探Date类、Calendar类、SimpleDateFormat类的认识java Random类、File类、System类初识 javaIO流 java IO流【…

static成员变量的本质?静态变量?静态类有什么意义?全局变量?类函数?

static成员变量的本质 面向对象编程语言喜欢将全局变量转移到类内部变成static变量,看起来不像全局变量。事实上,编译器会将static成员变量和全局变量看做的一样的,编程语言的写法减少程序员随意操作全局变量的可能,虽然事实上它们…

RK3566-移植5.10内核Ubuntu22.04

说明 记录了本人使用泰山派(RK3566)作为平台并且成功移植5.10.160版本kernel和ubuntu22.04,并且成功配置&连接网络的完整过程。 本文章所用ubuntu下载地址:ubuntu-cdimage-ubuntu-base-releases-22.04-release安装包下载_开源…

笔记day7

文章目录 1 分页功能实现2 分页器的展示需要哪些数据(条件)?3 自定义分页器4 分页器存在问题5 分页器动态展示6 开发某一个商品的详情页面 1 分页功能实现 为什么很多项目采用分页功能,比如电商平台同时展示的数据有很多&#xf…

【starrocks学习】之将starrocks表同步到hive

目录 方法 1:通过HDFS导出数据 1. 将StarRocks表数据导出到HDFS 2. 在Hive中创建外部表 3. 验证数据 方法 2:使用Apache Spark同步 1. 添加StarRocks和Hive的依赖 2. 使用Spark读取StarRocks数据并写入Hive 3. 验证数据 方法 3:通过…

stm32点灯 GPIO的输出模式

目录 1.选择RCC时钟 2.SYS 选择调试模式 SW 3.GPIO 配置 4.时钟树配置( 默认不变)HSI 高速内部时钟8Mhz 5.项目配置 6.代码 延时1s循环LED亮灭 1.选择RCC时钟 2.SYS 选择调试模式 SW 3.GPIO 配置 4.时钟树配置( 默认不变&#xff09…

Docker基础以及单体实战

Docker 一、Docker1.1 Docker组成1.2 Dcoker运行图1.3 名称空间Namepace 1.4 docker、Docker compose、kubermetes 二、Docker安装2.1 在线Docker安装2.2 使用官方通用安装脚本2.3 二进制安装Docker三、Docker基础命令3.1 启动类3.2 镜像类3.3 容器类3.4 网络类3.5 Docker comp…

搭建Python环境:为量化交易做准备

搭建Python环境:为量化交易做准备 在量化交易的世界里,一个稳定且高效的Python环境是成功的关键。本文将指导您如何从零开始搭建适用于量化交易的本地Python环境,并介绍一些常用的代码编辑器和工具。 Python环境安装指南 官网安装&#xf…