node笔记
path
path.basename() 返回给定路径的最后一部分
path.basename('C:\temp\myfile.html')
// 返回myfile.html
path.dirname() 返回除最后一个路径的其他路径 与 basename 互补
path.extname 返回拓展名
path.extname('C:\temp\myfile.html')
// 返回.html
path.join 拼接路径
path.join('/fool','/cks','/ccc')
// 返回 /fool/cks/ccc
可以支持 … ./ …/操作符
path.join('/foo','/cxk','/ikun','../')
// /foo/cxk/
path.resolve 用于将相对路径解析并返回绝对路径
// 1 传入多个绝对路径 返回最右侧的
path.resolve('/aaa','/bbb','/ccc')
// /ccc
// 2 传入绝对路径 + 相对路径
path.resolve(__dirname,'./readme.md')
// /User/xiaoman/DeskTop/node/readme.md
// 3 只传入相对路径
path.resolve('./readme.md')
// 返回 工作目录 + readme.md
path.parse 与 path.format (互补)
parse
用于解析文件路径。它接受一个路径字符串作为输入,并返回一个包含路径各个组成部分的对象
path.parse('/home/user/dir/file.txt')
{
root: '/',
dir: '/home/user/dir',
base: 'file.txt',
ext: '.txt',
name: 'file'
}
root:路径的根目录,即 /。
dir:文件所在的目录,即 /home/user/documents。
base:文件名,即 file.txt。
ext:文件扩展名,即 .txt。
name:文件名去除扩展名,即 file。
format 正好相反 在把对象转回字符串
path.format({
root: '/',
dir: '/home/user/documents',
base: 'file.txt',
ext: '.txt',
name: 'file'
})
// /home/user/dir/file.txt
os
os 模块可以与操作系统进行交互
var os = require('node:os')
fs 文件系统模块(核心 api)
<!-- 读文件 -->
fs2.readFile("./readme.md").then(function (res) {
console.log(res);
});
fs.readFile("./readme.md", (err, data) => {
if (err) return err;
console.log(data.toString());
});
const text = fs.readFileSync("./readme.md");
console.log(text.toString());
<!-- 追加内容 -->
fs.writeFileSync("./readme.md", "java之父\n余胜军", {
flag: "a",
});
fs.appendFileSync('./readme.md','\n咚咚咚')
<!-- 创建可写流 大数据书写文件 -->
const verse = [
'待到秋来九月八',
'我花开后百花杀',
'冲天香阵透长安',
'满城尽带黄金甲',
]
const writeStream = fs.createWriteStream('index.txt')
verse.map(item=>{
writeStream.write(item + '\n')
})
writeStream.end()
writeStream.on('finish',()=>{
console.log('写入完成')
})
crypto 密码学
对称加密
// 生成一个随机的 16 字节的初始化向量 (IV)
const iv = Buffer.from(crypto.randomBytes(16));
console.log(iv); // <Buffer 08 9e 87 76 52 c1 24 e9 2b 80 4c f6 da 1c ed 5d>
// 生成 随机32字节的密匙
const key = crypto.randomBytes(32);
console.log(key);
// 创建加密实例 使用 AES-256-CBC算法 提供密钥和初始化向量
const cipher = crypto.createCipheriv("aes-256-cbc", key, iv);
// 对输入数据进行加密
cipher.update("xiaojj", "utf-8", "hex");
const result = cipher.final("hex");
console.log(result);
// 解密
const de = crypto.createDecipheriv("aes-256-cbc", key, iv);
de.update(result, "hex");
const decrypted = de.final("utf-8");
console.log(decrypted);
非对称加密
// 生成RSA密钥对
const { privateKey, publicKey } = crypto.generateKeyPairSync("rsa", {
modulusLength: 2048,
});
// 要加密的数据
const tetx = "春眠不觉晓,处处闻啼鸟,夜来风雨声,花落知多少";
// 使用公钥加密
const encrypted = crypto.publicEncrypt(publicKey, Buffer.from(tetx, "utf-8"));
// 使用私钥解密
const decrypted = crypto.privateDecrypt(privateKey, encrypted);
console.log(decrypted.toString(), encrypted);
哈希函数
// 要计算哈希的数据
let text = "鹅鹅鹅";
// 创建哈希对象 使用md5算法
const hash = crypto.createHash("md5");
// 更新哈希对象的数据
hash.update(text);
// 计算哈希值,并以16进制字符串形式输出
const hashValue = hash.digest("hex");
console.log("Text", text);
console.log("Hash", hashValue);
连表 and 子查询
-- Active: 1730363543284@@127.0.0.1@3306@xiaoman
SELECT *
FROM `photo`
WHERE
`user_id` = (
SELECT id
FROM `user`
WHERE
name = 'whh'
);
-- 内连接
SELECT * FROM `user`, `photo` WHERE `user`.`id` = `photo`.`user_id`;
-- 外连接 - 左连接
SELECT *
FROM `user`
LEFT JOIN `table` ON `user`.`id` = `table`.`user_id`;
-- 外连接 - 右连接
SELECT * FROM `user` RIGHT JOIN `table` ON `user`.`id` = `table`.user_id;