diff --git "a/\351\231\210\347\205\234\344\275\263/20260316-\350\264\242\345\257\214\347\256\241\347\220\206\347\263\273\347\273\237.md" "b/\351\231\210\347\205\234\344\275\263/20260316-\350\264\242\345\257\214\347\256\241\347\220\206\347\263\273\347\273\237.md" new file mode 100644 index 0000000000000000000000000000000000000000..f2ff36e09457e38540af6385e5756c14314f2f79 --- /dev/null +++ "b/\351\231\210\347\205\234\344\275\263/20260316-\350\264\242\345\257\214\347\256\241\347\220\206\347\263\273\347\273\237.md" @@ -0,0 +1,54 @@ +## 笔记 + +框架 + +```js +import fs from 'fs'; + +const FILE_PATH = './money.json'; + +let commander = process.argv[2]; + +let params = process.argv[3]; + +if (commander == 'add') { + +} else if (commander == 'del') { + +} else if (commander == 'amount') { + +} else if (commander == 'list') { + +} else if (commander = 'clear') { + +} + +// 从指定文件中读取所有数据,并且反序列化,最终返回数组 + +function readFromJson() { + // 文件存在,则读取 + if (fs.existsSync(FILE_PATH)) { + + return []; + + } + + else { + + } + +} + +// 将json字符串写入指定文件 + +function writeToJson(arr) { + +} + +// 希望入账以后,打印当前余额 + +function printAmount() { + +} +``` + diff --git "a/\351\231\210\347\205\234\344\275\263/20260318-\345\237\272\346\234\254\351\205\215\347\275\256.md" "b/\351\231\210\347\205\234\344\275\263/20260318-\345\237\272\346\234\254\351\205\215\347\275\256.md" new file mode 100644 index 0000000000000000000000000000000000000000..6ffbe23030925b4a9254df1dee3c45f6369b2bb1 --- /dev/null +++ "b/\351\231\210\347\205\234\344\275\263/20260318-\345\237\272\346\234\254\351\205\215\347\275\256.md" @@ -0,0 +1,185 @@ +## 笔记 + +### 格式化输出 + +```javascript +// %s 字符串 +console.log('%s 今天学习了 %d 小时', '小明', 2); + +// %d 数字 +console.log('进度: %d%%', 75); + +// %j JSON +console.log('%j', {name: '张三', age: 20}); +``` + +### 进程信息 + +```javascript +// Node.js版本信息 +console.log(process.version); // v24.x.x +console.log(process.versions.node); // 24.x.x +console.log(process.versions.v8); // x.x.x + +// 平台信息 +console.log(process.platform); // win32 / darwin / linux +console.log(process.arch); // x64 / arm64 + +// 当前工作目录 +console.log(process.cwd()); // 返回当前工作目录 + +// 环境变量 +console.log(process.env.USER); // 用户名 +console.log(process.env.NODE_ENV); // 环境变量 +``` + +### path模块:路径基本操作 + +```js +const path = require('path'); + +// 获取目录 +console.log(__dirname); // 当前文件所在目录 +console.log(process.cwd()); // 当前工作目录 + +// 获取文件名 +console.log(__filename); // 当前文件完整路径 + +// path.join() - 拼接路径 +const fullPath = path.join(__dirname, 'src', 'index.js'); +console.log(fullPath); // .../src/index.js + +// path.resolve() - 解析为绝对路径 +const absPath = path.resolve('index.js'); +console.log(absPath); // C:/Users/.../index.js +``` + +### 文件 + +文件创建时间:`stats.birthtime` + +文件修改时间:`stats.mtime` + +## 简答题 + + 1. 这两个都是 JavaScript 控制台打印方法,核心区别是用途、输出样式、日志级别和浏览器处理方式不同,日常开发和调试中分工完全不一样。 + + 2. process.argv 是 Node.js 专属的属性,它返回一个字符串数组,专门用来获取命令行执行脚本时传入的参数。 + + 3. Buffer 是 Node.js 专门用来处理二进制数据的特殊对象,和普通数组完全不是一个东西,用途、存储、性能都有巨大差异。 + + 4. __dirname:当前 JS 文件的文件夹路径,永远不变process.cwd():执行 node 命令的目录,会变写文件路径必须用 __dirname,避免路径错误 + + 5. path.join:简单拼接,不一定是绝对路径path.resolve:模拟 cd 命令,永远返回绝对路径开发中优先用 path.resolve(__dirname, '路径'),最安全! + + +## 操作题 + +1. ```js + // 导入内置模块(这里不需要额外安装) + const process = require('process'); + + // 打印所有环境变量 + console.log('=== 当前系统所有环境变量 ==='); + console.log(process.env); + ``` + +2. ```js + import fs, { read } from 'fs'; + + let js = process.argv[2]; + let a = process.argv[3]; + let b = process.argv[4]; + + if (isNaN(a) == false && isNaN(b) == false) { + if (js == "add") { + console.log(a + " + " + b + " 等于 "); + let add = Number(a) + Number(b); + console.log(add); + } else if (js == "sub") { + console.log(a + " - " + b + " 等于 "); + let sub = Number(a) - Number(b); + console.log(sub); + } else if (js == "mul") { + console.log(a + " * " + b + " 等于 "); + let mul = Number(a) * Number(b); + console.log(mul); + } else if (js == "div") { + console.log(a + " / " + b + " 等于 "); + let div = Number(a) / Number(b); + console.log(div); + } else { + console.log("命令错误!"); + } + } else { + console.log("请输入正确数字!"); + } + + ``` + +3. ```js + let chine = '你好'; + let done = Buffer.from(chine,'utf-8'); + console.log(done); + + let towdone = done.toString('utf-8'); + console.log(towdone); + + ``` + +4. ```js + // **路径处理**:创建一个程序,接收文件路径,输出文件名、扩展名、所在目录。 + + const path = require('path'); + const filePath = '/Node.js笔记/2026-03-18/lx1/calc.js'; + console.log(__filename); + console.log(path.basename(filePath)); + console.log(path.extname(filePath)); + console.log('文件目录:', __dirname); + ``` + +5. ```js + import fs from 'fs'; + + let con = process.argv[2]; + let a = process.argv[3]; + + if (con == 'add') { + console.log('添加成功!'); + let add = rea(); + add.push({ "name": a }); + write(add); + let newadd = rea(); + console.log(newadd); + + } else if (con == 'del') { + console.log('删除成功!'); + let idx = parseInt(a); + let dela = rea(); + dela.splice(idx - 1, 1); + write(dela); + + } else if (con == 'list') { + let list = rea(); + console.log(list); + + } else { + console.log('命令无效!'); + + } + + function rea(flieP) { + flieP = flieP || './app.js'; + if (fs.existsSync(flieP)) { + let data = fs.readFileSync(flieP, 'utf-8'); + return JSON.parse(data) || []; + } + return []; + } + + function write(flieC, flieP) { + flieP = flieP || './app.js'; + let jos = JSON.stringify(flieC); + fs.writeFileSync(flieP, jos); + } + ``` \ No newline at end of file diff --git "a/\351\231\210\347\205\234\344\275\263/20260319-\346\226\207\344\273\266\347\263\273\347\273\237\346\250\241\345\235\227.md" "b/\351\231\210\347\205\234\344\275\263/20260319-\346\226\207\344\273\266\347\263\273\347\273\237\346\250\241\345\235\227.md" new file mode 100644 index 0000000000000000000000000000000000000000..915271f3815b0ccccc3b7e74d976a5b7b387caf7 --- /dev/null +++ "b/\351\231\210\347\205\234\344\275\263/20260319-\346\226\207\344\273\266\347\263\273\347\273\237\346\250\241\345\235\227.md" @@ -0,0 +1,163 @@ +## 笔记 + +### 读取 +```js +// 读取文件(同步) +const content = fs.readFileSync('./data.txt', 'utf8'); +console.log(content); + +// 读取文件(异步回调) +fs.readFile('./data.txt', 'utf8', (err, data) => { + if (err) { + console.error('读取失败:', err); + return; + } + console.log('文件内容:', data); +}); + +``` + +### 写入 + +```js +// 写入文件(同步) +fs.writeFileSync('./data.txt', 'Hello World'); + +// 异步写入 +fs.writeFile('./data.txt', 'Hello World', 'utf8', (err) => { + if (err) throw err; + console.log('写入成功'); +}); +``` + +### 目录 + +```js +//目录创建 + +const fs = require('fs'); + +// 创建单个目录(同步) +fs.mkdirSync('./backup'); + +// 创建多级目录(同步) +fs.mkdirSync('./backup/data/images', { recursive: true }); + +// 异步创建 +fs.mkdir('./backup', { recursive: true }, (err) => { + if (err) throw err; + console.log('创建成功'); +}); + +//目录读取 +const files = fs.readdirSync('./src'); +console.log(files); +``` + + + +### 简答题 + + 1. 同步阻塞,异步不阻塞 + + 2. readFile 异步,readFileSync 同步 + + 3. 追加写入用 fs.appendFile + + 4. 流 = 分段处理,适合大文件 + + 5. 监听文件变化用 fs.watch + +### 操作题 + +1. ```js + const fs = require('fs'); + + const content = fs.readFileSync('./data.txt', 'utf8'); + console.log(content); + ``` + +2. ```js + fs.writeFileSync('./new.txt', 'Hello Node.js'); + ``` + +3. ```js + const fs = require('fs'); + + // 复制文件 + function copyFile(src, dest) { + const data = fs.readFileSync(src); + fs.writeFileSync(dest, data); + } + copyFile('./source.txt', './dest.txt'); + ``` + +4. ```js + const fs = require('fs'); + const path = require('path'); + + function findFiles(dir, ext, fileList = []) { + const files = fs.readdirSync(dir); + + + files.forEach(file => { + const filePath = path.join(dir, file); + const stat = fs.statSync(filePath); + + if (stat.isDirectory()) { + findFiles(filePath, ext, fileList); + } + + else { + if (path.extname(file) === ext) { + fileList.push(filePath); + } + } + }); + + return fileList; + } + + const result = findFiles(__dirname, '.js'); + + console.log(`共找到 ${result.length} 个 .js 文件:`); + console.log(result); + ``` + +5. ```js + const fs = require('fs'); + const path = require('path'); + const { format } = require('date-fns'); + + const LOG_FILE = path.join(__dirname, 'app.log'); + + class Logger { + static write(level, message) { + const timestamp = format(new Date(), 'yyyy-MM-dd HH:mm:ss'); + + const log = `[${timestamp}] [${level.toUpperCase()}] ${message}\n`; + + console.log(log.trim()); + + fs.appendFile(LOG_FILE, log, (err) => { + if (err) console.error('日志写入失败:', err); + }); + } + + static info(message) { + this.write('info', message); + } + + static warn(message) { + this.write('warn', message); + } + + static error(message) { + this.write('error', message); + } + } + + Logger.info('服务启动成功'); + Logger.warn('磁盘空间不足'); + Logger.error('数据库连接失败'); + ``` \ No newline at end of file diff --git "a/\351\231\210\347\205\234\344\275\263/20260320-HTTP\346\250\241\345\235\227.md" "b/\351\231\210\347\205\234\344\275\263/20260320-HTTP\346\250\241\345\235\227.md" new file mode 100644 index 0000000000000000000000000000000000000000..b163a5fb65c4e2bd763052300c2c7da390fc4e15 --- /dev/null +++ "b/\351\231\210\347\205\234\344\275\263/20260320-HTTP\346\250\241\345\235\227.md" @@ -0,0 +1,181 @@ +## 笔记 + +HTTP协议和服务器通信: + +- 打开浏览器访问百度 → 浏览器发送HTTP请求 → 服务器返回HTML +- 登录账号 → 发送POST请求 → 服务器验证并返回结果 +- 点击按钮 → 发送Ajax请求 → 服务器返回数据 + +```js +const http = require('http'); + +const server = http.createServer((req, res) => { + + // req: 请求对象 + // res: 响应对象 + + // 设置响应头 + res.writeHead(200, { 'Content-Type': 'text/html;charset=utf-8' }); + + // 返回响应 + res.end('
欢迎来到我的网站
'; + }else{ + content = '这是一个Node.js学习项目
'; + } + return content; + } + ``` +2. 计算器API + ```js + const express = require('express'); + const app = express(); + + app.use(express.json()); + + app.post('/api/add', (req, res) => { + const { num1, num2 } = req.body; + if (isNaN(num1) || isNaN(num2)) { + return res.status(400).json({ error: '请传入有效数字' }); + } + const result = parseFloat(num1) + parseFloat(num2); + res.json({ operation: 'add', num1, num2, result }); + }); + + app.post('/api/subtract', (req, res) => { + const { num1, num2 } = req.body; + if (isNaN(num1) || isNaN(num2)) { + return res.status(400).json({ error: '请传入有效数字' }); + } + const result = parseFloat(num1) - parseFloat(num2); + res.json({ operation: 'subtract', num1, num2, result }); + }); + + app.post('/api/multiply', (req, res) => { + const { num1, num2 } = req.body; + if (isNaN(num1) || isNaN(num2)) { + return res.status(400).json({ error: '请传入有效数字' }); + } + const result = parseFloat(num1) * parseFloat(num2); + res.json({ operation: 'multiply', num1, num2, result }); + }); + + app.post('/api/divide', (req, res) => { + const { num1, num2 } = req.body; + if (isNaN(num1) || isNaN(num2)) { + return res.status(400).json({ error: '请传入有效数字' }); + } + + const n2 = parseFloat(num2); + if (n2 === 0) { + return res.status(400).json({ error: '除数不能为零' }); + } + + const result = parseFloat(num1) / n2; + res.json({ operation: 'divide', num1, num2, result }); + }); + + const PORT = 3000; + app.listen(PORT, () => { + console.log(`计算器 API 运行在 http://localhost:${PORT}`); + }); + ``` + +3. 图片服务器 + ```js + const express = require('express'); + const path = require('path'); + const app = express(); + const PORT = 3000; + + app.use('/images', express.static(path.join(__dirname, 'images'))); + + app.get('/', (req, res) => { + res.send(` +访问图片:http://localhost:${PORT}/images/你的图片名
+示例:http://localhost:${PORT}/images/test.jpg
+ `); + }); + + app.use((req, res) => { + res.status(404).send('图片不存在'); + }); + + app.listen(PORT, () => { + console.log(`图片服务器已启动:http://localhost:${PORT}`); + }); + ``` + +4. 天气查询 + ```js + ``` + +5. 代理服务器 + ```js + ``` \ No newline at end of file diff --git "a/\351\231\210\347\205\234\344\275\263/\345\271\263\345\256\211\347\254\246.png" "b/\351\231\210\347\205\234\344\275\263/\345\271\263\345\256\211\347\254\246.png" new file mode 100644 index 0000000000000000000000000000000000000000..be9301a32cabf00fab860f51683a82a46bb3a261 Binary files /dev/null and "b/\351\231\210\347\205\234\344\275\263/\345\271\263\345\256\211\347\254\246.png" differ