Node.js模块化
常用的内置模块:fs、path、http、querystring
node.js模块库:www.npmjs.com/
http模块
- 是node.js中内置的模块
// 1.引入nodejs里的内置http模块
// node require exports
const http = require("http");
// 2.创建http服务器
// request 请求报文
// response 响应
const server = http.createServer(function (req, resp) {
// 告诉浏览器,给它的内容该如何进行解读
resp.setHeader("Content-Type", "text/html;charset=utf-8");
// 2.1 接受get请求
// 2.2 处理请求,并且响应结果
if (req.method != "GET") {
resp.write("对不起,不支持其他请求,只支持get");
resp.end(); //立即断开
return;
}
resp.write("你看到我了吗?你好 hi...hi");
resp.end(); //立即断开
});
// 设置监听端口
server.listen(8181, () => {
console.log("服务器启动完毕!");
});
querystring模块
qs模块的方法
/*
4个方法:
stringify() 把对象转换成字符串
parse() 把字符串转为对象
unescape() 解码 decodeURIComponent()
escape() 编码 encodeURIComponent()
*/
方法的使用
// 1.导入模块
const qs = require("querystring");
// stringify() 把对象转换成字符串
var params = {
id: 1,
name: "张婧怡",
sex: "女",
age: 20,
hobby: ["唱歌", "跳舞"],
};
//stringify 默认用 & 和 = 拼接
let str = qs.stringify(params);
// 可以自定义
let str1 = qs.stringify(params, "~", "@");
console.log(qs.unescape(str)); //unescape() 解码
console.log(qs.escape(str1)) //escape() 编码
// parse() 把字符串转为对象
let strr = "id=1&name=张婧怡&sex=女&age=20&hobby=唱歌&hobby=跳舞";
// 默认转换 & 和 = 符号连接的字符串
console.log(qs.parse(strr));
// 可以设置
let strr1 = "id@1~name@张婧怡~sex@女~age@20~hobby@唱歌~hobby@跳舞";
console.log(qs.parse(strr1,"~","@"))
fs 文件系统模块
- 方法:每一个方法都有同步和异步两种,带Sync表示同步的
/*
1.stat() 判断是文件还是文件夹
isFile() 是文件吗?
isDirectory() 是文件夹吗?
2.mkdir() 创建文件夹
3.writeFile() 写入内容
4.appendFile() 追加内容
5.readFile() 读取文件内容
6.readdir() 读取目录,读取指定路径下的所有内容(文件和文件夹)
7.rename() 重命名(文件和文件夹)
8.rmdir() 删除文件夹(只能删除空的文件夹)
{recursive:true,force:true} 强制删除有内容的文件夹
9.unlink() 删除文件
10.copyFile() 拷贝文件
11.读取文件到其他文件
createReadStream() 读
createWriteStream() 写
pipe() 管道流,小内容可以,但是大文件、视频、音频不推荐使用它
*/
jsonwebtoken 加密
1、生成公钥和私钥
打开gitbash,输入 openssl
1).生成私钥
genrsa -out rsa_private_key.pem [指定长度,如1024,默认2048]
2).生成公钥
rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
2、使用
const fs = require("fs")
const jwt = require("jsonwebtoken")
// 通过openssl
// 私钥:genrsa -out rsa_private_key.pem
// 公钥:rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
//私钥
const privateKey = fs.readFileSync("./rsa_private_key.pem").toString()
// 公钥
const publicKey = fs.readFileSync("./rsa_public_key.pem").toString()
// console.log(publicKey);
let token = jwt.sign({name:"黄景瑜"},privateKey,{
expiresIn:60*60, //3600秒
algorithm:"RS256" //加密算法
})
console.log(token);
// 通过网络发送给别人,别人解密
const res = jwt.decode(token,{algorithm:["RS256"]},publicKey)
console.log("结果:",res);
url模块
-
url模块方法:
-
parse() 路径转对象(重点)
pathname、query
parse(url,true) 第二个参数填true可以让query变成一个对象
2.format() 对象转路径(了解就行)
-
1、parse():路径转对象(重点)
const url = require("url");
var baseUrl = "http://www.baidu.com:8080/api/login?name=abc&pwd:123#/aaa";
const obj = url.parse(baseUrl);
// console.log(obj);
console.log(obj.protocol); //协议 http:
console.log(obj.host); // www.baidu.com:8080
console.log(obj.hostname); // www.baidu.com
console.log(obj.port); // 端口 8080
console.log(obj.path); ///api/login?name=abc&pwd:123
console.log(obj.pathname); ///api/login
console.log(obj.search); //?name=abc&pwd:123
console.log(obj.query); //name=abc&pwd:123
console.log(obj.hash); //#/aaa
console.log("-----------------------------");
// 重点
var baseUrl = "http://www.baidu.com:8080/api/login?name=abc&pwd:123#/aaa";
const { pathname, query } = url.parse(baseUrl, true); //true,快速让query变成一个对象
console.log(pathname);
console.log(query);
2、format():对象变url(了解)
const url = require("url");
// -------对象变url-----
var myobj = {
protocol: "http:",
slashes: true,
auth: null,
host: "www.baidu.com:8080",
port: "8080",
hostname: "www.baidu.com",
hash: "#/aaa",
search: "?name=abc&pwd:123",
query: "name=abc&pwd:123",
pathname: "/api/login",
path: "/api/login?name=abc&pwd:123",
href: "http://www.baidu.com:8080/api/login?name=abc&pwd:123#/aaa",
};
console.log(url.format(myobj));
path模块
path模块的方法
/*
path模块的方法:
1.join() 拼接
2.resolve() 拼接和替换
3.extname() 后缀
4.basename() 得到最后一部分(文件名称+后缀名)
5.dirname() 得到路径名称,不带最后一部分
__dirname,得到当前文件所在的位置(用途:代码移植)
*/
方法的使用
const path = require("path");
// --------- 1.join() 拼接 ---------
console.log(path.join("/aaa", "/bbb"));
console.log(path.join("/aaa", "bbb"));
console.log(path.join("aaa", "/bbb"));
console.log(path.join("aaa", "bbb"));
console.log(path.join("/aaa/", "/bbb/"));
// --------- 2.resolve() 拼接和替换 ---------
console.log(path.resolve("aaa", "bbbb")); // D:\千峰\练习\day\上课案例\js课程\Nodejs\day02\aaa\bbbb
// 拼接
console.log(path.resolve("/aaa", "bbb")); //D:\aaa\bbb
// 替换,第二个参数首尾带/
console.log(path.resolve("/aaa", "/bbb")); //D:\bbb
// --------- 3.extname() 后缀 ---------
var str = "abc.jpg.sdd.ff.gif"
console.log(path.extname(str));//.gif
// --------- 4.basename() 文件名称+后缀名 ---------
var str = "D:/aa/bb/cc/ss/头像.jpeg"
console.log(path.basename(str));//头像.jpeg
// --------- 5.dirname() 得到路径名称,不带最后一部分 ---------
var str = "D:/aa/bb/cc/ss/头像.jpeg"
console.log(path.dirname(str));//D:/aa/bb/cc/ss
// __dirname,得到当前文件(08-path模块.js)所在的位置
console.log(__dirname);