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