From 83c3ea84b01be47c05e79d1b5fa541f2329102f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=9B=A8=E7=BF=94?= <1792756256@qq.com> Date: Tue, 17 Mar 2026 15:32:12 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=9A=84=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../20260316+\347\273\203\344\271\240.md" | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 "\346\235\216\351\233\250\347\277\224/20260316+\347\273\203\344\271\240.md" diff --git "a/\346\235\216\351\233\250\347\277\224/20260316+\347\273\203\344\271\240.md" "b/\346\235\216\351\233\250\347\277\224/20260316+\347\273\203\344\271\240.md" new file mode 100644 index 0000000..3a8e4f5 --- /dev/null +++ "b/\346\235\216\351\233\250\347\277\224/20260316+\347\273\203\344\271\240.md" @@ -0,0 +1,85 @@ +## 优化过的代码 +```js +import fs from 'fs' + +let FILE_PATH = './obts.json'; + +const comment = process.argv[2]; +const prant = process.argv[3]; + +if(comment == 'list'){ + console.log('获取全部账单列表'); + let list = readInput(); + console.log(list); + +}else if(comment == 'add'){ + console.log('到账'); + let money = readInput(); + console.log(money); + + money.push({ + 'amount': prant * 1, + 'type': 'input', + 'date': new Date() + }); + writeOutput(money); + + readFont(); + +}else if(comment == 'del'){ + console.log('出账'); + let money = readInput(); + money.push({ + 'amount': prant * 1, + 'type' : 'output', + 'date': new Date() + }); + writeOutput(money); + readFont(); + +}else if(comment == 'amount'){ + let list = readInput(); + console.log(list); + +}else if(comment == 'clear'){ + console.log('删除'); + writeOutput([]); + +}else{ + console.log('未知功能有待开发...'); + +} + +function readInput(){ + if(fs.existsSync(FILE_PATH)){ + let data = fs.readFileSync(FILE_PATH,'utf-8'); + if(data.length > 0){ + return JSON.parse(data); + } + return []; + } + return []; +} + +function writeOutput(content){ + let jsonString = JSON.stringify(content); + fs.writeFileSync(FILE_PATH,jsonString) +} + +function readFont(){ + let moneyFont = readInput(); + let sumInput = 0; + let sumOutinput = 0; + moneyFont.forEach(item => { + if(item.type == 'input'){ + sumInput += item.amount; + }else if(item.type == 'output'){ + sumOutinput += item.amount; + } + }); + + let sum = sumInput - sumOutinput; + console.log(sum); + +} +``` \ No newline at end of file -- Gitee From d5fcc5599b4ab7a0589269cb7506f90e9cc7da91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=9B=A8=E7=BF=94?= <1792756256@qq.com> Date: Sun, 22 Mar 2026 19:18:31 +0800 Subject: [PATCH 2/2] file --- ...3\347\240\201+\347\273\203\344\271\240.md" | 0 ...1\345\235\227+\347\273\203\344\271\240.md" | 278 +++++++++++++ ...1\345\235\227+\347\273\203\344\271\240.md" | 388 ++++++++++++++++++ ...1\345\235\227+\347\273\203\344\271\240.md" | 322 +++++++++++++++ 4 files changed, 988 insertions(+) rename "\346\235\216\351\233\250\347\277\224/20260316+\347\273\203\344\271\240.md" => "\346\235\216\351\233\250\347\277\224/20260316-\344\274\230\345\214\226\350\277\207\347\232\204\344\273\243\347\240\201+\347\273\203\344\271\240.md" (100%) create mode 100644 "\346\235\216\351\233\250\347\277\224/20260318-\345\237\272\346\234\254\345\206\205\347\275\256\346\250\241\345\235\227+\347\273\203\344\271\240.md" create mode 100644 "\346\235\216\351\233\250\347\277\224/20260319-\346\226\207\344\273\266\347\263\273\347\273\237\346\250\241\345\235\227+\347\273\203\344\271\240.md" create mode 100644 "\346\235\216\351\233\250\347\277\224/20260320-HTTP\346\250\241\345\235\227+\347\273\203\344\271\240.md" diff --git "a/\346\235\216\351\233\250\347\277\224/20260316+\347\273\203\344\271\240.md" "b/\346\235\216\351\233\250\347\277\224/20260316-\344\274\230\345\214\226\350\277\207\347\232\204\344\273\243\347\240\201+\347\273\203\344\271\240.md" similarity index 100% rename from "\346\235\216\351\233\250\347\277\224/20260316+\347\273\203\344\271\240.md" rename to "\346\235\216\351\233\250\347\277\224/20260316-\344\274\230\345\214\226\350\277\207\347\232\204\344\273\243\347\240\201+\347\273\203\344\271\240.md" diff --git "a/\346\235\216\351\233\250\347\277\224/20260318-\345\237\272\346\234\254\345\206\205\347\275\256\346\250\241\345\235\227+\347\273\203\344\271\240.md" "b/\346\235\216\351\233\250\347\277\224/20260318-\345\237\272\346\234\254\345\206\205\347\275\256\346\250\241\345\235\227+\347\273\203\344\271\240.md" new file mode 100644 index 0000000..1a7b4de --- /dev/null +++ "b/\346\235\216\351\233\250\347\277\224/20260318-\345\237\272\346\234\254\345\206\205\347\275\256\346\250\241\345\235\227+\347\273\203\344\271\240.md" @@ -0,0 +1,278 @@ +## 基本内置模块 +```js +// 1. console模块 - 多种输出方式 +console.log('普通信息'); +console.info('提示信息'); +console.warn('警告信息'); +console.error('错误信息'); +console.table([{name: '张三', age: 20}]); + +// 2. process模块 - 获取进程信息 +console.log('Node版本:', process.version); +console.log('平台:', process.platform); +console.log('当前目录:', process.cwd()); + +// 3. Buffer模块 - 处理二进制 +const buf = Buffer.from('Hello'); +console.log(buf); // + +// 4. path模块 - 路径处理 +const path = require('path'); +console.log(__dirname); +console.log(__filename); +``` + +### process模块 +```js +// 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); // 环境变量 +``` + +### 进程控制 +```js +// 退出程序 +process.exit(0); // 正常退出 +process.exit(1); // 异常退出 + +``` + +### Buffer模块 +```js +// 从字符串创建 +const buf1 = Buffer.from('你好'); +// 从字符串创建(指定编码) +const buf2 = Buffer.from('你好', 'utf8'); +// 创建指定长度的Buffer +const buf3 = Buffer.alloc(10); // 10字节,初始值为0 +// 不初始化(可能有旧数据,速度快) +const buf4 = Buffer.allocUnsafe(10); + +// 从数组创建 +const buf5 = Buffer.from([72, 101, 108, 108, 111]); // "Hello" +``` + +### 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 +``` + +### 常用方法速查 +```js +// console +console.log('信息'); +console.warn('警告'); +console.error('错误'); +console.table([{a:1}]); +console.time('timer'); +console.timeEnd('timer'); + +// process +process.version; +process.platform; +process.cwd(); +process.argv; +process.exit(0); + +// Buffer +Buffer.from('str'); +Buffer.alloc(10); +buf.toString(); + +// path +path.join(__dirname, 'src'); +path.resolve('file.js'); +path.basename(filepath); +path.extname(filepath); +``` + +### 练习 +下面哪个方法可以获取Node.js的版本号? +``` + process.version +``` +Buffer.alloc(10)创建的Buffer,长度是多少字节? +``` +1 +``` +"你好"的Buffer长度是? +``` +6 +``` +__dirname表示什么? +``` +当前文件所在目录 +``` +console.time()和console.timeEnd()的作用是? +``` +计时 +``` +请解释console.log和console.error的区别。 +``` +console.log : 打印内容 +console.error : 打印错误的内容 +``` + +process.argv返回的数组包含哪些内容?请举例说明。 +``` +1. 命令行参数 +2. 可执行js文件 +3. 文件路径 +``` + +Buffer和普通数组有什么区别? +``` +Buffer是字符编码的数据,数组是用于存储数据 +``` + +__dirname和process.cwd()有什么区别? +``` +__dirname : 用户获取当前文件夹 +process.cwd() : 当前工作目录 +``` + +path.join()和path.resolve()有什么区别? +``` +path.join() : 路径分割符拼接路劲 +path.resolve() : 将路径解析成绝对路径 +``` + +信息展示:创建一个程序,输出当前系统的所有环境变量。 +```js +console.log('NODE_ENV: ',process.env.NODE_ENV || '未设置'); +console.log('HOME: ',process.env.HOME || process.env.USERPROFILE); + +``` + +参数解析:创建一个计算器程序,支持: + +node calc.js add 5 3 → 输出 8 +node calc.js sub 5 3 → 输出 2 +node calc.js mul 5 3 → 输出 15 +```js +const content = process.argv[2]; +const a = process.argv[3] * 1; +const b = process.argv[4] * 1; + +let sum = 0; +if(content == 'add'){ + console.log('加'); + sum = a + b; +}else if(content == 'sub'){ + console.log('减'); + sum = a - b; +}else if(content == 'mul'){ + console.log('乘'); + sum = a * b +}else{ + console.log('未知'); + +} +console.log(sum); + +``` +Buffer操作:创建一个程序,将中文字符串转为Buffer,再转回字符串,验证是否一致。 +```js +let str = '你好'; + +let buffer = Buffer.from(str); +console.log('中文字符串转为Buffe: ',buffer); +console.log('buffer转字符串',buffer.toString()); +``` +路径处理:创建一个程序,接收文件路径,输出文件名、扩展名、所在目录。 +```js + +let path = require('path'); +let filePath = __filename + +console.log(__filename); + +let fileName = path.basename(filePath,'.js') +console.log(fileName); +console.log(path.extname(filePath)); + +console.log(path.dirname(filePath)); + + + +``` +综合应用:创建一个CLI工具,接受命令行参数,实现简单的待办列表功能(添加、列出、删除)。 +```js +import fs from 'fs' + +const FILE_PATH = './btas.json' + +const content = process.argv[2]; +const paren = process.argv[3]; +if(content == 'add'){ + console.log('添加'); + let arr = readFile(); + console.log(arr); + arr.push({ + 'title': paren, + 'isDone' : false, + 'data' : new Date() + }); + writeFile(arr); + console.log('添加完成'); + let newArr = readFile(); + console.log(newArr); + +}else if(content == 'list'){ + console.log('列出'); + let list = readFile(); + console.log(list); + +}else if(content == 'del'){ + writeFile([]); +}else{ + console.log('未知'); + +} + +function readFile(){ + if(fs.existsSync(FILE_PATH)){ + let data = fs.readFileSync(FILE_PATH); + if(data != null){ + return JSON.parse(data); + } + return []; + } + return []; +} + +function writeFile(cont){ + let jsonString = JSON.stringify(cont); + fs.writeFileSync(FILE_PATH,jsonString); +} +``` + + + diff --git "a/\346\235\216\351\233\250\347\277\224/20260319-\346\226\207\344\273\266\347\263\273\347\273\237\346\250\241\345\235\227+\347\273\203\344\271\240.md" "b/\346\235\216\351\233\250\347\277\224/20260319-\346\226\207\344\273\266\347\263\273\347\273\237\346\250\241\345\235\227+\347\273\203\344\271\240.md" new file mode 100644 index 0000000..96c10b4 --- /dev/null +++ "b/\346\235\216\351\233\250\347\277\224/20260319-\346\226\207\344\273\266\347\263\273\347\273\237\346\250\241\345\235\227+\347\273\203\344\271\240.md" @@ -0,0 +1,388 @@ +## 文件系统模块 +### 读取文件 +```js +const fs = require('fs'); + +// 读取文件(同步) +const content = fs.readFileSync('./data.txt', 'utf8'); +console.log(content); + +// 指定编码读取 +const content2 = fs.readFileSync('./data.txt', { encoding: 'utf8' }); + +// 读取图片等二进制文件 +const buffer = fs.readFileSync('./image.png'); +``` + +### 异步读取(回调方式) +```js +const fs = require('fs'); + +// 读取文件(异步回调) +fs.readFile('./data.txt', 'utf8', (err, data) => { + if (err) { + console.error('读取失败:', err); + return; + } + console.log('文件内容:', data); +}); + +// 读取二进制 +fs.readFile('./image.png', (err, buffer) => { + if (err) throw err; + console.log('文件大小:', buffer.length, '字节'); +}); +``` + 异步读取(Promise方式) +```js +const fs = require('fs').promises; + +// 读取文件(Promise) +async function readFile() { + try { + const content = await fs.readFile('./data.txt', 'utf8'); + console.log(content); + } catch (err) { + console.error('读取失败:', err); + } +} + +readFile(); + +``` + +### 写入文件 +同步写入 +```js +const fs = require('fs'); + +// 写入文件(同步) +fs.writeFileSync('./data.txt', 'Hello World'); + +// 追加写入 +fs.appendFileSync('./log.txt', '新内容\n'); + +// 写入二进制 +const buffer = Buffer.from([1, 2, 3, 4]); +fs.writeFileSync('./data.bin', buffer); +``` + +异步写入 +```js +const fs = require('fs'); + +// 异步写入 +fs.writeFile('./data.txt', 'Hello World', 'utf8', (err) => { + if (err) throw err; + console.log('写入成功'); +}); + +// 异步追加 +fs.appendFile('./log.txt', '新内容\n', (err) => { + if (err) throw err; + console.log('追加成功'); +}); +``` +Promise方式 +```js +const fs = require('fs').promises; + +async function writeData() { + await fs.writeFile('./data.txt', 'Hello World', 'utf8'); + console.log('写入成功'); +} + +writeData(); +``` + +### 文件操作 + 检查文件状态 +```js +const fs = require('fs'); + +// 检查文件/目录是否存在 +fs.existsSync('./data.txt'); // true 或 false + +// 获取文件状态 +const stats = fs.statSync('./data.txt'); +console.log('是文件:', stats.isFile()); +console.log('是目录:', stats.isDirectory()); +console.log('文件大小:', stats.size, '字节'); +console.log('创建时间:', stats.birthtime); +console.log('修改时间:', stats.mtime); + +// 异步版本 +fs.stat('./data.txt', (err, stats) => { + console.log('大小:', stats.size); +}); + +``` +删除文件 +```js +const fs = require('fs'); + +// 删除文件(同步) +fs.unlinkSync('./temp.txt'); + +// 删除文件(异步) +fs.unlink('./temp.txt', (err) => { + if (err) throw err; + console.log('删除成功'); +}); + +// Promise版本 +await fs.unlink('./temp.txt'); +``` + +复制文件 +```js +const fs = require('fs'); + +// 复制文件 +function copyFile(src, dest) { + const data = fs.readFileSync(src); + fs.writeFileSync(dest, data); +} +copyFile('./source.txt', './dest.txt'); + +// 或者使用流 +const readStream = fs.createReadStream('./source.txt'); +const writeStream = fs.createWriteStream('./dest.txt'); +readStream.pipe(writeStream); +``` + +重命名和移动 +```js +const fs = require('fs'); + +// 重命名 +fs.renameSync('./old.txt', './new.txt'); + +// 移动(跨目录重命名) +fs.renameSync('./file.txt', './backup/file.txt'); +``` + +### 目录操作 +创建目录 +```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('创建成功'); +}); +``` +读取目录 +```js +const fs = require('fs'); + +// 读取目录内容(同步) +const files = fs.readdirSync('./src'); +console.log(files); // ['index.js', 'utils.js', 'data'] + +// 读取详细信息 +const items = fs.readdirSync('./src', { withFileTypes: true }); +for (const item of items) { + console.log(`${item.name} - ${item.isDirectory() ? '目录' : '文件'}`); +} +``` +删除目录 + +```js +const fs = require('fs'); + +// 删除空目录(同步) +fs.rmdirSync('./empty-dir'); + +// 删除目录及内容(同步,Node.js 16+) +fs.rmSync('./backup', { recursive: true, force: true }); + +// 旧版本使用 +const fsExtra = require('fs-extra'); +await fsExtra.remove('./backup'); +``` + +### Watch监听文件变化 +```js +const fs = require('fs'); + +// 监听文件变化 +fs.watch('./data.txt', (eventType, filename) => { + console.log('事件类型:', eventType); + console.log('文件名:', filename); +}); + +// 使用fs.watchFile(更详细) +fs.watchFile('./data.txt', { persistent: true }, (curr, prev) => { + console.log('文件修改时间变化了'); + console.log('之前:', prev.mtime); + console.log('现在:', curr.mtime); +}); + +// 停止监听 +fs.unwatchFile('./data.txt'); +``` + +### 常用方法速查 +```js +const fs = require('fs'); + +// 读取 +fs.readFileSync(path, 'utf8'); +fs.readFile(path, 'utf8', callback); + +// 写入 +fs.writeFileSync(path, data); +fs.appendFileSync(path, data); + +// 检查 +fs.existsSync(path); +fs.statSync(path); + +// 操作 +fs.mkdirSync(path, { recursive: true }); +fs.readdirSync(path); +fs.unlinkSync(path); +fs.renameSync(oldPath, newPath); +fs.copyFileSync(src, dest); +``` + + +#### 练习 +下面哪个方法可以检查文件是否存在? +```js + fs.existsSync() +``` +写入文件使用哪个方法? +```js +fs.writeFileSync() +``` +appendFileSync和writeFileSync的区别是? +```js +append是追加,write是覆盖 +``` +如何创建一个多级目录? +```js +fs.mkdirSync('./a/b/c', { recursive: true }) +``` +下面哪个方法可以获取文件的详细信息(大小、时间等)? +```js +fs.readdirSync() +``` +请解释同步方法和异步方法的区别。 +``` +同步方法:等待这个方法完成执行下个方法 +异步方法:直接执行下个方法让代码不阻塞 +``` +fs.readFile和fs.readFileSync有什么区别? +``` +fs.readFile:异步获取文件内容 +fs.readFileSync:同步获取文件内容 +``` +如何实现文件的追加写入? +``` +可以获取数据内容转化为数组追加后将新内容传输到文件上 +``` +什么是流式处理?它适合什么场景? +流式处理是指多个文件,适用于处理流式数据或高效文件操作的场景 +``` + +如何监听文件的变化? +``` +获取文件数据与更新的数据进行比较来观察文件的变化 +``` + +文件读取器:创建一个程序,读取指定文件的内容并输出到控制台 +``` + + +### 操作题 +文件读取器:创建一个程序,读取指定文件的内容并输出到控制台。 +```js +let fs = require('fs'); + +let filePath = process.argv[2]; +let content = process.argv[3]; + +let reFile = fs.readFileSync(filePath,'utf-8'); +console.log(reFile); +let wrFile = fs.writeFileSync(filePath,content); +``` +文件写入器:创建一个程序,接收命令行输入的内容,写入到文件中。 +```js + + +let fs = require('fs'); + +let src = process.argv[2]; +let dest = process.argv[3]; + +let data = fs.readFileSync(src); + +fs.writeFileSync(dest,data); + +``` +目录复制:实现一个函数,递归复制整个目录。 +```js +const path = require('path'); +let file = process.argv[2]; +let base = process.argv[3]; + +let fielPath = path.dirname(file); +console.log(fielPath); + +let f = path.basename(fielPath,base); +console.log(f); +``` +文件搜索:创建一个文件搜索工具,查找指定目录下所有特定类型的文件(如.js文件)。 +```js +const fs = require('fs'); +const path = require('path'); + +let dir = process.argv[2] ; +let ext = process.argv[3] ; +let files = []; + +function search(d) { + let entries = fs.readdirSync(d, { withFileTypes: true }); + for (let e of entries) { + let p = path.join(d, e.name); + if (e.isDirectory()) search(p); + else if (e.isFile() && e.name.endsWith('.' + ext)) files.push(p); + } +} + +search(dir); + +console.log(`找到 ${files.length} 个 .${ext} 文件:`); +files.forEach({f} => { + console.log(f) + }); + + +``` +日志系统:创建一个简单的日志系统,支持写入日志到文件,包含时间戳和日志级别。 +```js +import fs from 'fs'; + +let logFile = process.argv[2]; +let lo = process.argv[3]; +let message = process.argv[4]; + +function log(filePath, level, message) { + const timestamp = new Date().toISOString(); + const logLine = `[${timestamp}] [${level}] ${message}\n`; + fs.appendFileSync(filePath, logLine, 'utf8'); +} + + +log(logFile,lo,message); + +``` \ No newline at end of file diff --git "a/\346\235\216\351\233\250\347\277\224/20260320-HTTP\346\250\241\345\235\227+\347\273\203\344\271\240.md" "b/\346\235\216\351\233\250\347\277\224/20260320-HTTP\346\250\241\345\235\227+\347\273\203\344\271\240.md" new file mode 100644 index 0000000..a5632cc --- /dev/null +++ "b/\346\235\216\351\233\250\347\277\224/20260320-HTTP\346\250\241\345\235\227+\347\273\203\344\271\240.md" @@ -0,0 +1,322 @@ +## HTTP模块 + +|表格|说明| +|---|---| +|创建HTTP服务器|使用http.||createServer|创建Web服务器| +|处理请求| 获取请求方法和URL| +|返回响应| 发送HTML、JSON、图片等| +|处理路由| 根据不同URL返回不同内容| + +### 创建HTTP服务器 +```js +const http = require('http'); +//创建服务器 +http.createServer((req,res) => { + // req: 请求对象 + // res: 响应对象 + + // 返回响应 + res.writeHead(200, { 'Content-Type': 'text/plain' }); + res.end('Hello World!'); +}) + +// 监听端口 +server.listen(3000, () => { + console.log('服务器运行在 http://localhost:3000'); +}); + +``` + +### 请求对象(req) +```js +// 请求方法 + req.method // GET, POST, PUT, DELETE + +// 请求URL + req.url // /, /about, /api/user + +// 请求头 +'User-Agent:', req.headers['user-agent'] + + // URL路径(不含查询字符串) + const urlObj = new URL(req.url, `http://${req.headers.host}`); + console.log('路径:', urlObj.pathname); + + // 查询参数 + urlObj.searchParams.get('name') + + res.end('OK'); +``` + +响应对象(res) +```js +// 1. 设置状态码 + res.statusCode = 200; // 成功 + res.statusCode = 404; // 未找到 + res.statusCode = 500; // 服务器错误 + +// 2. 设置响应头 + res.setHeader('Content-Type', 'text/html; charset=utf-8'); + res.setHeader('Content-Type', 'application/json'); + res.setHeader('Set-Cookie', 'name=zhangsan'); + + +// 3. 写入响应头 + res.writeHead(200, { + 'Content-Type': 'text/html; charset=utf-8', + 'Access-Control-Allow-Origin': '*' + }); + + // 4. 发送响应体 + res.end('Hello'); + + // 或者发送JSON + res.end(JSON.stringify({ name: '张三', age: 20 })); +``` + +### 练习 +请解释req和res分别代表什么? +``` +req: 请求对象 +res: 响应对象 +``` +http.createServer的回调函数接收哪些参数? +``` +http.createServer回调函数接收请求对象和响应对象 +``` +http.createServer 回调函数返回请求对象和 +响应对象 +``` +如何获取URL中的查询参数? +``` +可以根据URL某个id来获取某个数据 +``` +res.writeHead和res.setHeader有什么区别? +res.writeHead : 是将响应信息上传上去 +res.setHeader : 是获取请求头的数据 +``` +http.get和http.request有什么区别? +``` +http.get自动将请求方法设置为gei请求 +``` + +静态服务器:创建一个Web服务器,返回HTML页面,包含CSS样式。 +```js + + + +

HelloWord

+ + + + +import http from 'http'; +import fs from 'fs'; +import path from 'path'; +import { log } from 'console'; + +let webFile = fs.readFileSync("demo.html"); +let server = http.createServer((req, res) => { + + res.writeHead(200, { 'Content-Type': 'text/html' }); + res.end(webFile); + +}); + +server.listen(3000, () => { + console.log('http://localhost:3000'); + +}); +``` + +计算器API:创建RESTful API,支持加、减、乘、除运算。 +```js +import http from 'http'; +import { rest } from './RESTfulApi.js'; +let a = process.argv[2] * 1; +let b = process.argv[3] * 1; +let server = http.createServer((req, res) => { + res.writeHead(200, { 'Content-Type': 'text/html;charset=utf-8' }); + let sum = rest(req, a, b); + + res.end(sum); +}); + +server.listen(3000, () => { + console.log('http://localhost:3000'); + +}) + + +export function rest(req, a, b) { + let method = req.method; + let path = req.url; + console.log(path); + + + let sum = ''; + let cont = ''; + if (method === 'GET' && path == '/api/mul') { + + sum = a * b; + cont = a + ' * ' + b + ' = ' + + } else if (method === 'POST' && path == '/api/add') { + + sum = a + b; + cont = a + ' + ' + b + ' = ' + } else if (method === 'PUT' && path == '/api/div') { + if (b == 0) { + console.log('错误'); + return; + + } + sum = a / b; + cont = a + ' / ' + b + ' = ' + + } else if (method === 'DELETE' && path == '/api/sub') { + sum = a - b; + cont = a + ' - ' + b + ' = ' + } else { + sum = '未使用'; + } + + return cont + sum.toString(); +} + + +@url=http://localhost:3000 + +### 乘法 +GET {{url}}/api/mul HTTP/1.1 + +### 加法 +POST {{url}}/api/add HTTP/1.1 + +### 除法 +PUT {{url}}/api/div HTTP/1.1 + +### 减法 + +DELETE {{url}}/api/sub HTTP/1.1 + +``` + +创建一个简单的图片服务器,根据URL返回指定目录下的图片。 +```js +import { log } from 'console'; +import http from 'http'; +import fs from 'fs'; + +let imgFile = fs.readFileSync('img.png'); +log(imgFile); +let server = http.createServer((req,res) => { + res.writeHead(200,{'Content-Type':'image/jpeg;charset=utf-8'}); + res.end(imgFile); +}) + +let port = 3000 +server.listen(port,() => { + log(`http://localhost:${port}`); +}) + +``` + +创建一个天气查询工具,调用第三方API获取天气信息。 +```js +import { log } from 'console'; +import http from 'http'; +import https from 'https' + +let server = http.createServer((req, res) => { + if (req.method === 'GET' && req.url === '/') { + const options = { + hostname: 'uapis.cn', + path: '/api/v1/misc/weather', + method: 'GET' + } + let apiReq = https.request(options, (apiReq) => { + let data = '' + apiReq.on('data', (chunk) => { + data += chunk + }) + apiReq.on('end', () => { + res.writeHead(200, { 'Content-Type': 'application/json;charset=utf-8' }); + res.end(data); + + }) + + }) + apiReq.end(); + } +}); + +let port = 3000; +server.listen(port, () => { + log(`http://localhost:${port}`); +}) +``` + +代理服务器:创建一个简单的代理服务器,将请求转发到另一个服务器。 +```js +import http from 'http'; +import path from 'path'; + +let server = http.createServer((req, res) => { + let options = { + hostname: 'localhost', + port: 3001, + path: req.url, + method: req.method, + headers: req.headers + } + let server2 = http.request(options, (p) => { + res.writeHead(p.statusCode,p.headers); + p.pipe(res) + + }) + + req.pipe(server2) +}); + + + +let port = 3000; +server.listen(port, () => { + console.log(`http://localhost:${port}`); +}) + + + +import http from 'http'; +import { hostname } from 'os'; + +let server = http.createServer((req, res) => { + let body = ''; + req.on('data', (chunk) => { + body += chunk; + }); + req.on('end', () => { + let par = { + hostname: 'localhost', + port: 3000, + method: req.method, + headers: req.headers, + url: req.url, + body: body || null + } + res.writeHead(200, { 'Content-Type': 'text/html;charset=utf-8' }); + res.end(JSON.stringify(par)); + + }) +}); + +let port = 3001; +server.listen(port, () => { + console.log(`http://localhost:${port}`); +}) +``` \ No newline at end of file -- Gitee