From 935085be9d87f5b6760dc9c474e0749147af8a79 Mon Sep 17 00:00:00 2001
From: seele <3412896462@qq.com>
Date: Sun, 22 Mar 2026 15:17:00 +0000
Subject: [PATCH 1/2] =?UTF-8?q?=E5=90=95=E7=A5=A5=E5=8B=8712?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: seele <3412896462@qq.com>
---
.../20260316.md" | 17 +++
.../20260318.md" | 49 +++++++++
.../20260319.md" | 53 ++++++++++
.../20260320.md" | 100 ++++++++++++++++++
4 files changed, 219 insertions(+)
create mode 100644 "\345\220\225\347\245\245\345\213\207/20260316.md"
create mode 100644 "\345\220\225\347\245\245\345\213\207/20260318.md"
create mode 100644 "\345\220\225\347\245\245\345\213\207/20260319.md"
create mode 100644 "\345\220\225\347\245\245\345\213\207/20260320.md"
diff --git "a/\345\220\225\347\245\245\345\213\207/20260316.md" "b/\345\220\225\347\245\245\345\213\207/20260316.md"
new file mode 100644
index 00000000..2b71d1b3
--- /dev/null
+++ "b/\345\220\225\347\245\245\345\213\207/20260316.md"
@@ -0,0 +1,17 @@
+
+function readFile(filePath) {
+ // 调用你传的文件路径,否则默认为way
+ filePath = filePath || './way.json';
+ if (fs.existsSync(filePath)) {
+ let data = fs.readFileSync(filePath, 'utf-8');
+
+ return JSON.parse(data) || [];
+ }
+ return [];
+}
+
+function writeFile(fileContent, filePath) {
+ filePath = filePath || './way.json';
+ let jsonString = JSON.stringify(fileContent);
+ fs.writeFileSync(filePath, jsonString);
+}
\ No newline at end of file
diff --git "a/\345\220\225\347\245\245\345\213\207/20260318.md" "b/\345\220\225\347\245\245\345\213\207/20260318.md"
new file mode 100644
index 00000000..c7cf3602
--- /dev/null
+++ "b/\345\220\225\347\245\245\345\213\207/20260318.md"
@@ -0,0 +1,49 @@
+# 笔记
+
+
+
+# 作业
+
+## 选择题
+- 下面哪个方法可以获取Node.js的版本号?
+
+- B. process.version
+
+- Buffer.alloc(10)创建的Buffer,长度是多少字节?
+
+- A. 10
+
+- "你好"的Buffer长度是?
+
+- C. 6
+
+- __dirname表示什么?
+
+- B. 当前文件所在目录
+
+- console.time()和console.timeEnd()的作用是?
+
+- A. 计时
+
+## 简答题
+- 请解释console.log和console.error的区别。
+
+ - console.log() 用于一般的日志输出,而 console.error() 专门用于错误信息的输出,具有更明显的视觉标识和不同的输出流。
+
+- process.argv返回的数组包含哪些内容?请举例说明。
+
+ - 第一个元素:Node.js 可执行文件的路径 - 第二个元素:正在执行的 JavaScript 文件路径 - 后续元素:传递给脚本的命令行参数
+
+- Buffer和普通数组有什么区别?
+
+ - Buffer 本质上是字节数组,每个元素都是一个字节
+ - 普通数组可以包含任意类型的元素,如整数、字符串等
+- __dirname和process.cwd()有什么区别?
+
+ - __dirname 总是指向当前脚本文件所在的目录,而 process.cwd() 指向的是执行 Node.js 命令时所在的目录
+
+- path.join()和path.resolve()有什么区别?
+
+ - path.join() 会忽略前面的路径片段,如果遇到绝对路径参数
+
+ - path.resolve() 会以绝对路径为基准,从右向左处理直到构建出绝对路径
diff --git "a/\345\220\225\347\245\245\345\213\207/20260319.md" "b/\345\220\225\347\245\245\345\213\207/20260319.md"
new file mode 100644
index 00000000..9dc4720b
--- /dev/null
+++ "b/\345\220\225\347\245\245\345\213\207/20260319.md"
@@ -0,0 +1,53 @@
+# 笔记
+
+```javascript
+
+import fs from 'fs'
+import { log } from 'console';
+
+// 拿到参数
+let dirPath = process.argv[2];
+
+
+// 调用函数
+browser(dirPath);
+
+function browser(dir, indent = 0) {
+ // 判断路径是否存在
+ if (!fs.existsSync(dir)) {
+ log('路径不存在,请确认后重试');
+ return;
+ }
+
+ if(!isDirectory(dir)){
+ log('路径不是个目录');
+ return;
+ }
+
+ let prefix = ' '.repeat(indent);
+
+ // 读取目录内容
+ let arr = fs.readdirSync(dir);
+
+ // 遍历目录目录内容
+ arr.forEach(item => {
+ // 如果是目录,则继续调用browser方法,递归显示目录信息;如果是文件,则直接输出
+
+ // 拼接项目的完整路径,准备判断是文件还是目录
+ let fullPath = dir + '/' + item;
+ // 根据拼接的项目的完整路径,拿到其状态信息
+ let fileStat = fs.statSync(fullPath);
+ if (fileStat.isDirectory()) {
+ log(prefix + item);
+ browser(fullPath, indent + 1)
+ } else {
+ log(prefix + item)
+ }
+ })
+}
+
+function isDirectory(dir) {
+ let fileStat = fs.statSync(dir);
+ return fileStat.isDirectory();
+
+}
\ No newline at end of file
diff --git "a/\345\220\225\347\245\245\345\213\207/20260320.md" "b/\345\220\225\347\245\245\345\213\207/20260320.md"
new file mode 100644
index 00000000..e1986076
--- /dev/null
+++ "b/\345\220\225\347\245\245\345\213\207/20260320.md"
@@ -0,0 +1,100 @@
+# 笔记
+
+
+## 端口
+
+🌐 网页服务
+端口 协议 服务
+80 TCP HTTP
+443 TCP HTTPS
+8080 TCP HTTP 代理 / 常用备用 Web 端口
+8443 TCP 备用 HTTPS(如 Tomcat)
+
+📧 邮件服务
+端口 协议 服务
+25 TCP SMTP(邮件发送)
+110 TCP POP3(邮件接收)
+143 TCP IMAP(邮件接收)
+465 TCP SMTPS(SSL/TLS 发送)
+587 TCP SMTP 提交(邮件客户端发送)
+993 TCP IMAPS(SSL/TLS)
+995 TCP POP3S(SSL/TLS)
+
+📁 文件传输
+端口 协议 服务
+20, 21 TCP FTP(20 数据,21 控制)
+22 TCP SSH / SFTP
+69 UDP TFTP
+
+🗄️ 数据库
+端口 协议 数据库
+1433 TCP SQL Server
+3306 TCP MySQL / MariaDB
+5432 TCP PostgreSQL
+6379 TCP Redis
+27017 TCP MongoDB
+1521 TCP Oracle DB
+
+🖥️ 远程管理
+端口 协议 服务
+22 TCP SSH
+23 TCP Telnet
+3389 TCP RDP(远程桌面)
+5900+ TCP VNC(默认 5900,后续 +1)
+
+📡 网络服务
+端口 协议 服务
+53 TCP/UDP DNS
+67, 68 UDP DHCP(67 服务端,68 客户端)
+123 UDP NTP
+161, 162 UDP SNMP
+389 TCP/UDP LDAP
+636 TCP LDAPS
+
+🧩 其他常见服务
+端口 协议 服务
+2181 TCP ZooKeeper
+2375, 2376 TCP Docker(2375 非加密,2376 TLS)
+3000 TCP Node.js / 开发框架默认端口
+5000 TCP Flask / 许多开发服务
+9200, 9300 TCP Elasticsearch
+9092 TCP Kafka
+11211 TCP Memcached
+
+
+
+## 创建web服务器
+
+```javascript
+
+import { log } from 'console';
+// 引入http
+import http from 'http'
+
+// 创建web服务器
+const app = http.createServer((req, res) => {
+ // 解析文件为html类型,utf-8避免乱码
+ res.writeHead(200, { "content-type": "text/html; charset=utf-8"});
+ let content = '';
+ let path = req.url;
+ log(req.url);
+ if(path == '/'){
+ content = '我的第一个网站';
+ }else if(path == '/about'){
+ content = '易遇'
+ }else if(path == '/aaa'){
+ content = '顾时夜'
+ }
+
+ // let content = rest(req);
+ // 发送响应内容
+ res.end(content);
+});
+
+// 监听
+
+// 3000为端口
+let port = 3000;
+app.listen(port, () => {
+ log(`服务器运行在以下地址,请妥当使用:http://localhost:${port}`)
+});
\ No newline at end of file
--
Gitee
From 6faae2a50247eef0eccb399518422dca23fc4f19 Mon Sep 17 00:00:00 2001
From: seele <3412896462@qq.com>
Date: Sun, 29 Mar 2026 09:20:53 +0000
Subject: [PATCH 2/2] =?UTF-8?q?=E5=90=95=E7=A5=A5=E5=8B=8712?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: seele <3412896462@qq.com>
---
.../20260323.md" | 70 +++++
.../20260325.md" | 198 +++++++++++++
.../20260326.md" | 130 ++++++++
.../20260327.md" | 277 ++++++++++++++++++
4 files changed, 675 insertions(+)
create mode 100644 "\345\220\225\347\245\245\345\213\207/20260323.md"
create mode 100644 "\345\220\225\347\245\245\345\213\207/20260325.md"
create mode 100644 "\345\220\225\347\245\245\345\213\207/20260326.md"
create mode 100644 "\345\220\225\347\245\245\345\213\207/20260327.md"
diff --git "a/\345\220\225\347\245\245\345\213\207/20260323.md" "b/\345\220\225\347\245\245\345\213\207/20260323.md"
new file mode 100644
index 00000000..eefa5ef5
--- /dev/null
+++ "b/\345\220\225\347\245\245\345\213\207/20260323.md"
@@ -0,0 +1,70 @@
+# Node.js 事件循环 极简笔记
+
+## 一、核心概念
+
+### 1. 为什么需要事件循环
+
+- Node.js 是**单线程**,依靠事件循环实现**非阻塞、高并发**
+- 核心理念:**不等待结果,先处理其他任务,结果返回后再执行回调**
+
+### 2. 事件循环作用
+
+- 单线程处理大量并发请求
+- 异步操作(I/O、定时器)不阻塞主线程
+
+## 二、任务分类与执行顺序
+
+### 1. 任务类型
+
+| 类型 | 包含任务 | 特点 |
+|------|----------|------|
+| **同步代码** | 普通JS代码 | 最高优先级,立即执行 |
+| **微任务** | process.nextTick、Promise.then | 宏任务前执行,nextTick 优先级最高 |
+| **宏任务** | setTimeout、setInterval、setImmediate、I/O | 事件循环阶段依次执行 |
+
+### 2. 标准执行顺序
+
+**同步代码 → process.nextTick → Promise.then → 宏任务(setTimeout → setImmediate)**
+
+### 3. 代码示例
+
+```javascript
+console.log('1'); // 同步
+
+setTimeout(()=>console.log('2'),0); // 宏任务
+Promise.resolve().then(()=>console.log('3')); // 微任务
+process.nextTick(()=>console.log('4')); // 微任务(最高)
+
+console.log('5'); // 同步
+
+// 输出:1 → 5 → 4 → 3 → 2
+```
+
+## 三、事件循环阶段(顺序)
+
+1. **timers**:执行 setTimeout/setInterval
+2. pending callbacks:延迟I/O回调
+3. idle/prepare:内部使用
+4. **poll**:获取I/O事件,执行I/O回调
+5. **check**:执行 setImmediate
+6. close callbacks:关闭事件回调
+
+## 四、关键API
+
+### 1. process.nextTick
+
+- Node.js 独有,**微任务最高优先级**
+- 比 Promise.then 先执行
+
+### 2. 阻塞与非阻塞
+
+- **阻塞操作**(禁止):同步I/O、大量循环、复杂计算
+- **非阻塞方案**:异步API、setImmediate 拆分任务、Worker Threads
+
+## 五、核心总结
+
+1. 执行优先级:**同步 > nextTick > Promise > 宏任务**
+2. 事件循环是单线程高并发的核心
+3. 避免同步阻塞,优先使用异步API
+4. 宏任务分阶段执行,微任务在宏任务间隙清空
+```
\ No newline at end of file
diff --git "a/\345\220\225\347\245\245\345\213\207/20260325.md" "b/\345\220\225\347\245\245\345\213\207/20260325.md"
new file mode 100644
index 00000000..31889274
--- /dev/null
+++ "b/\345\220\225\347\245\245\345\213\207/20260325.md"
@@ -0,0 +1,198 @@
+# Express 入门极简笔记(Markdown)
+
+# 任务1 初识Express 学习笔记
+
+## 一、核心基础
+
+### 1. 为什么学Express
+
+- 基于**Node.js**的极简Web框架,用于快速搭建网站、API服务
+- 相比原生Node.js:**代码少、路由简单、自带中间件、开发效率高**
+
+### 2. Web核心流程
+
+浏览器 → 发送HTTP请求 → Express服务器处理 → 返回HTTP响应
+
+---
+
+## 二、环境搭建
+
+### 1. 初始化项目
+
+```bash
+# 创建文件夹并进入
+mkdir express-demo && cd express-demo
+
+# 初始化package.json
+npm init -y
+
+# 安装express
+npm install express
+```
+
+### 2. 项目结构
+
+```
+express-demo/
+├─ src/index.js 主服务文件
+├─ package.json 项目配置
+└─ node_modules/ 依赖包
+```
+
+---
+
+## 三、第一个Express应用
+
+### 1. 最简代码
+
+```javascript
+// 引入框架
+const express = require('express')
+const app = express()
+const port = 3000
+
+// 路由:处理GET请求
+app.get('/', (req, res) => {
+ res.send('
Hello Express
')
+})
+
+// 启动服务器
+app.listen(port, () => {
+ console.log(`服务运行:http://localhost:${port}`)
+})
+```
+
+### 2. 启动运行
+
+```bash
+node src/index.js
+# 或配置脚本后:npm start
+```
+
+---
+
+## 四、核心概念
+
+### 1. 路由(请求处理)
+
+```javascript
+// 首页
+app.get('/', (req, res) => {})
+// 关于页
+app.get('/about', (req, res) => {})
+// API接口
+app.get('/api/users', (req, res) => {
+ res.json([{id:1,name:'张三'}])
+})
+```
+
+### 2. req & res 对象
+
+- `req`:请求对象(获取请求信息)
+ - req.method 请求方式
+ - req.url 请求地址
+ - req.query 地址栏参数
+- `res`:响应对象(返回数据给前端)
+ - res.send() 返回文本/HTML
+ - res.json() 返回JSON数据
+ - res.status(404) 设置状态码
+
+### 3. RESTful API 规范
+
+| 请求方式 | 作用 |
+|---------|------|
+| GET | 查询/获取数据 |
+| POST | 新增数据 |
+| PUT | 修改数据 |
+| DELETE | 删除数据 |
+
+---
+
+## 五、常用响应方法
+
+```js
+res.send('文本/HTML') // 普通响应
+res.json({ data: [] }) // JSON接口
+res.status(404).send('找不到')// 带状态码
+res.redirect('/about') // 重定向
+```
+
+---
+
+## 六、执行步骤总结
+
+1. 初始化项目 + 安装 express
+2. 编写 `index.js` 主服务
+3. 配置路由(app.get / app.post...)
+4. 启动服务 `app.listen()`
+5. 浏览器访问测试
+
+---
+
+## 七、高频考点/简答题速记
+
+1. **Express 优势**:代码简洁、路由便捷、中间件生态完善、适合API开发
+2. **执行顺序**:同步代码 → 路由匹配 → 响应返回
+3. **req/res**:req 拿请求,res 返响应
+4. **启动方法**:`app.listen(端口, 回调)`
+5. **RESTful**:用不同请求方式操作资源,接口规范统一
+
+## 练习
+
+1.Express是哪个语言的Web框架?
+C. JavaScript
+
+2.启动Express服务器需要调用哪个方法?
+C. app.listen()
+
+3.以下哪个方法用于返回JSON数据?
+B. res.json()
+
+4.Express相比原生Node.js的优势不包括?
+C. 内置数据库
+
+5.GET请求通常用于?
+C. 获取资源
+
+1. 什么是 RESTful API?它的设计原则是什么?
+RESTful API 是一种基于 HTTP 协议、面向资源的 API 设计风格,用 URL 表示资源,用 HTTP 方法表示操作。
+面向资源、使用http方法
+
+2. req 对象和 res 对象分别代表什么?常用属性和方法?
+req(request)请求对象
+代表客户端发来的请求,用来获取请求信息。
+res(response)响应对象
+代表服务器返回给客户端的响应,用来向客户端发送数据。
+
+3. Express 启动服务器用哪个方法?接收什么参数?
+使用 app.listen() 方法启动服务器。端口号:如 3000
+
+4. 前后端分离的优点?
+分工明确、开发效率高、架构灵活、便于维护、性能更好
+
+5. 为什么学 Express,不直接用原生 Node.js?
+代码更简洁、路由系统强大、路由系统强大、路由系统强大
+
+```js
+import fs, { Stats } from 'fs';
+
+function backup(sourceDir,destDir){
+ sourceDir = sourceDir || './source';
+ let fileStat = fs.statSync(sourceDir);
+ destDir = destDir || './dest';
+ let arr = fs.readdirSync(sourceDir);
+ console.log(arr);
+ arr.forEach(item => {
+ let sourcePath = sourceDir + '/' + item;
+ let destPath = destDir + '/' + item;
+ fs.copyFileSync(sourcePath,destPath);
+ })
+
+ if(fileStat.isDirectory()){
+ return;
+ }
+}
+
+
+backup();
+```
\ No newline at end of file
diff --git "a/\345\220\225\347\245\245\345\213\207/20260326.md" "b/\345\220\225\347\245\245\345\213\207/20260326.md"
new file mode 100644
index 00000000..be6ac760
--- /dev/null
+++ "b/\345\220\225\347\245\245\345\213\207/20260326.md"
@@ -0,0 +1,130 @@
+# 任务2 路由与请求处理 极简笔记(Markdown 整洁版)
+
+# 任务2 路由与请求处理 学习笔记
+
+## 一、核心概念
+
+### 1. 什么是路由?
+
+根据**请求URL + 请求方法**,匹配对应的处理函数,决定服务器如何响应。
+
+### 2. HTTP 请求方法(RESTful)
+
+| 方法 | 作用 | 示例 |
+|------|------|------|
+| GET | 获取资源 | `/users` |
+| POST | 创建资源 | `/users` |
+| PUT | 全量更新 | `/users/:id` |
+| PATCH | 部分更新 | `/users/:id` |
+| DELETE | 删除资源 | `/users/:id` |
+
+---
+
+## 二、三种请求参数(重点)
+
+### 1. 查询参数 req.query
+
+- 格式:`/api/users?page=1&limit=10`
+- 获取:`req.query.page`
+
+### 2. 路由参数 req.params
+
+- 格式:`/api/users/:id`
+- 获取:`req.params.id`
+
+### 3. 请求体 req.body(POST/PUT)
+
+- 格式:JSON 或表单数据
+- **必须先配置中间件**:
+
+ ```js
+ app.use(express.json())
+ ```
+
+- 获取:`req.body`
+
+---
+
+## 三、路由定义语法
+
+```javascript
+// 获取列表
+app.get('/api/users', (req, res) => {})
+
+// 获取单个
+app.get('/api/users/:id', (req, res) => {})
+
+// 创建
+app.post('/api/users', (req, res) => {})
+
+// 全量更新
+app.put('/api/users/:id', (req, res) => {})
+
+// 删除
+app.delete('/api/users/:id', (req, res) => {})
+
+// 匹配所有方法
+app.all('/path', (req, res) => {})
+```
+
+---
+
+## 四、必写配置(解析JSON)
+
+```js
+const express = require('express')
+const app = express()
+
+// 必须加!用于解析 POST/PUT 的 JSON 请求体
+app.use(express.json())
+```
+
+---
+
+## 五、常用响应方式
+
+```js
+res.send('文本/HTML') // 普通返回
+res.json({ data: [] }) // 返回 JSON(API 最常用)
+res.status(201).json(...) // 设置状态码再返回
+res.status(404).send('不存在')
+```
+
+---
+
+## 六、路由匹配规则
+
+- 精确匹配:`/about`
+- 字符串模式:`/ab?cd` `/ab*cd`
+- 正则匹配:`/.*fly$/`
+- **注意:路由按定义顺序匹配,先写先生效**
+
+---
+
+## 七、RESTful 路由模板(直接背)
+
+```js
+// 列表
+app.get('/api/users', (req, res) => {
+ const { page, limit } = req.query
+ res.json({ code:200, data:[] })
+})
+
+// 单个
+app.get('/api/users/:id', (req, res) => {
+ const { id } = req.params
+ res.json({ id, name:'' })
+})
+
+// 新增
+app.post('/api/users', (req, res) => {
+ const data = req.body
+ res.status(201).json({ data })
+})
+
+// 更新
+app.put('/api/users/:id', (req, res) => {})
+
+// 删除
+app.delete('/api/users/:id', (req, res) => {})
+```
\ No newline at end of file
diff --git "a/\345\220\225\347\245\245\345\213\207/20260327.md" "b/\345\220\225\347\245\245\345\213\207/20260327.md"
new file mode 100644
index 00000000..65525b09
--- /dev/null
+++ "b/\345\220\225\347\245\245\345\213\207/20260327.md"
@@ -0,0 +1,277 @@
+# 任务2 路由与请求处理 完整版简洁笔记
+
+# 任务2 路由与请求处理(学习笔记)
+
+## 一、三种请求参数(核心重点)
+
+Express 接收前端参数有 **3 种固定方式**,必须背熟。
+
+### 1. 查询参数 req.query
+
+- 位置:URL `?` 后面
+- 示例:`/search?keyword=node&page=1`
+- 获取:`req.query.keyword`
+
+```js
+app.get('/search', (req, res) => {
+ const { keyword, page = 1, limit = 10 } = req.query
+ res.json({ keyword, page, limit })
+})
+```
+
+### 2. 路由参数 req.params
+
+- 位置:URL 路径里 `/users/:id`
+- 示例:`/users/123`
+- 获取:`req.params.id`
+
+```js
+app.get('/users/:id', (req, res) => {
+ const { id } = req.params
+ res.json({ id })
+})
+
+// 多参数
+app.get('/users/:userId/posts/:postId', (req, res) => {
+ const { userId, postId } = req.params
+})
+```
+
+### 3. 请求体参数 req.body
+
+- 位置:POST/PUT 请求体内(JSON/表单)
+- **必须先配置解析中间件**
+
+```js
+// 必须写!!!
+app.use(express.json()) // 解析 JSON
+app.use(express.urlencoded({ extended: true })) // 解析表单
+```
+
+```js
+app.post('/api/users', (req, res) => {
+ const { name, email } = req.body
+ res.status(201).json({ name, email })
+})
+```
+
+---
+
+## 二、HTTP 请求方法(RESTful 标准)
+
+| 方法 | 作用 |
+|------|------|
+| GET | 查询/获取 |
+| POST | 新增 |
+| PUT | 全量更新 |
+| PATCH | 部分更新 |
+| DELETE | 删除 |
+
+---
+
+## 三、路由定义模板(直接复制)
+
+```js
+// 获取列表
+app.get('/api/users', (req, res) => {})
+
+// 获取单个
+app.get('/api/users/:id', (req, res) => {})
+
+// 创建
+app.post('/api/users', (req, res) => {})
+
+// 更新
+app.put('/api/users/:id', (req, res) => {})
+
+// 删除
+app.delete('/api/users/:id', (req, res) => {})
+```
+
+---
+
+## 四、RESTful API 设计规范
+
+1. **URL 代表资源**(/users、/posts)
+2. **HTTP 方法代表操作**(GET/POST/PUT/DELETE)
+3. **无状态**
+4. **统一返回 JSON**
+5. **正确使用状态码**(200/201/400/404)
+
+---
+
+## 五、常用响应方法
+
+```js
+res.send('文本/html')
+res.json({ data: [] }) // 接口最常用
+res.status(404).json({}) // 设置状态码
+res.status(201).json({}) // 创建成功
+```
+
+---
+
+## 六、完整 RESTful 用户 API(必背)
+
+```js
+const express = require('express')
+const app = express()
+app.use(express.json())
+
+let users = [{ id:1, name:'张三' }]
+
+// 列表
+app.get('/api/users', (req, res) => {
+ res.json({ code:200, data: users })
+})
+
+// 单个
+app.get('/api/users/:id', (req, res) => {
+ const user = users.find(u => u.id == req.params.id)
+ user ? res.json(user) : res.status(404).json({ msg:'不存在' })
+})
+
+// 新增
+app.post('/api/users', (req, res) => {
+ const newUser = { id:Date.now(), ...req.body }
+ users.push(newUser)
+ res.status(201).json(newUser)
+})
+
+// 更新
+app.put('/api/users/:id', (req, res) => {
+ const index = users.findIndex(u => u.id == req.params.id)
+ users[index] = { ...users[index], ...req.body }
+ res.json(users[index])
+})
+
+// 删除
+app.delete('/api/users/:id', (req, res) => {
+ users = users.filter(u => u.id != req.params.id)
+ res.json({ msg:'删除成功' })
+})
+
+app.listen(3000)
+```
+
+---
+
+## 七、分页 + 搜索(扩展)
+
+```js
+app.get('/api/users', (req, res) => {
+ let { page = 1, limit = 10, keyword = '' } = req.query
+ let data = users.filter(u => u.name.includes(keyword))
+ const result = data.slice((page-1)*limit, page*limit)
+ res.json({ data: result, page, total: data.length })
+})
+```
+
+## 练习
+
+1.获取URL查询参数应该使用哪个对象?
+D. req.url
+
+2.以下哪个HTTP方法用于创建资源?
+C. POST
+
+3.要获取路由参数 /users/:id 中的id,应该使用?
+B. req.params.id
+
+4.POST请求的参数在哪个对象中?
+C. req.body
+
+5.Express中解析JSON请求体需要使用哪个中间件?
+B. express.json
+
+1. GET、POST、PUT、DELETE 四种方法的区别
+GET:获取 / 查询资源
+POST:创建 / 新增资源
+PUT:全量更新资源
+DELETE:删除资源
+
+2. query 参数和 params 参数的区别
+query位置:URL 问号后面
+params位置:URL 路径中
+
+3. 什么是 RESTful API?设计原则?
+RESTful API 是基于 HTTP 的 API 设计规范,用 URL 表示资源,用 HTTP 方法表示操作。
+
+4. 为什么要用 RESTful 规范?好处?
+接口清晰易懂、统一规范、适配前后端分离、符合 HTTP 标准
+
+5. express.json () 中间件的作用?
+解析 POST/PUT 请求中的 JSON 格式请求体
+
+```js
+import express from 'express';
+import { port } from './config.js';
+
+let app = express();
+
+
+app.get('/api/calc',(req,res) => {
+ const {a,op,b} = req.query;
+ let numA = parseFloat(a);
+ let numB = parseFloat(b);
+
+ let result;
+ switch(op){
+ case 'add':
+ result = numA + numB;
+ break;
+ case 'sub':
+ result = numA - numB;
+ break;
+ case 'mul':
+ result = numA * numB;
+ break;
+ case 'div':
+ result = numA / numB;
+ break;
+ }
+
+ res.json({
+ a:numA,
+ op:op,
+ b:numB,
+ result:result
+ })
+
+})
+
+
+app.listen(port,() => {
+ console.log(`服务器运行在 http://localhost:${port}`);
+
+});
+```
+
+```js
+import express from "express";
+import { listen } from "express/lib/application";
+const index = express();
+
+const port = 3000;
+
+index.use(express.json());
+
+let users=[
+ {id:1,name:'大壮',hobbit:'学习外语'},
+ {id:2,name:'乔治',hobbit:'上床'}
+]
+
+index.get('api/users',(req,res) =>{
+ res.json({
+ code:200,
+ data:users,
+ total:users.length
+ });
+});
+
+
+index.listen(port,() =>{
+ console.log(`服务地址为:http://localhost:${port}`);
+
+});
+```
\ No newline at end of file
--
Gitee