# 23级nodejs练习任务 **Repository Path**: myhfw003/grade-23-node.js-practice-task ## Basic Information - **Project Name**: 23级nodejs练习任务 - **Description**: 23级nodejs练习任务 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 12 - **Created**: 2025-02-17 - **Last Updated**: 2025-03-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 23级全栈开发班Nodejs练习任务 ### 一、nodejs初识 1. 复习js - 任务1:创建一个简单的问候函数 ```js 要求: 编写一个函数greet,接受一个名字作为参数,并返回一个问候语,例如:“Hello, [名字]! Welcome to JavaScript.”。 ``` - 任务2:计算数组的平均值 ```js 要求: 编写一个函数calculateAverage,接受一个数字数组作为参数,并返回数组的平均值。 ``` - 任务3:检查字符串是否为回文 ```js 要求: 编写一个函数isPalindrome,接受一个字符串作为参数,判断该字符串是否为回文(正读和反读相同)。 ``` - 任务4:实现一个简单的计数器 ```js 要求: 使用闭包实现一个简单的计数器,每次调用时返回当前的计数值。 ``` - 任务5:过滤数组中的偶数 ```js 要求: 编写一个函数filterEvenNumbers,接受一个数字数组作为参数,返回一个只包含偶数的新数组。 ``` - 任务6:实现一个简单的对象工厂 ```js 要求: 编写一个函数createPerson,接受name和age作为参数,返回一个包含这些属性的对象。 ``` - 任务7:递归计算阶乘 ```js 要求: 编写一个递归函数factorial,计算一个非负整数的阶乘。 ``` - 任务8:实现一个简单的事件监听器 ```js 要求: 编写一个函数addEventListener,模拟HTML元素的事件监听器功能。接受一个事件类型和一个回调函数作为参数,并在触发时调用回调函数。 ``` - 任务9:实现一个简单的Promise ```js 要求: 使用Promise实现一个异步函数fetchData,模拟从服务器获取数据。如果成功,返回一个字符串;如果失败,抛出一个错误。 ``` - 任务10:实现一个简单的模块 ```js 要求: 使用模块模式封装一个mathUtils模块,包含add和multiply两个函数。 ``` 2. 在自己电脑上安装nodejs环境 3. 除了npm官方包管理器以外,还有哪些包管理器,各有哪些特点,各自如何安装 4. 在自己云服务器上安装nodejs环境 ### 二、完整nodejs项目及nodejs模块初识 1. 创建完整nodejs项目,配合git和git忽略文件,创建标准nodejs项目,托管在码云仓库 2. 梳理总结commonJs和ES模块的区别,以及常规用法 ### 三、基本模块及文件模块 1. 读取文件内容并打印 ``` 编写一个 Node.js 脚本,读取一个文本文件(example.txt)的内容,并将其打印到控制台。要求使用异步和同步两种方式实现。 提示:使用 fs.readFile() 和 fs.readFileSync()。 ``` 2. 写入文件内容 ``` 编写一个 Node.js 脚本,将一段文本内容写入到一个文件(output.txt)中。如果文件已存在,则覆盖原有内容;如果文件不存在,则创建文件。 提示:使用 fs.writeFile() 或 fs.writeFileSync()。 ``` 3. 追加内容到文件 ``` 编写一个 Node.js 脚本,将一段文本内容追加到一个文件(example.txt)的末尾。如果文件不存在,则自动创建文件。 提示:使用 fs.appendFile() 或 fs.appendFileSync()。 进阶练习题 ``` 4. 创建和删除文件 ``` 编写一个 Node.js 脚本,完成以下任务: 创建一个名为 test.txt 的文件,并写入内容 "Hello, Node.js!"。 检查文件是否存在,如果存在,则删除该文件。 提示:使用 fs.writeFile()、fs.existsSync() 和 fs.unlink()。 ``` 5. 创建和删除目录 ``` 编写一个 Node.js 脚本,完成以下任务: 创建一个名为 testDir 的目录。 在该目录下创建一个名为 example.txt 的文件,并写入内容 "This is a test file."。 删除该目录及其所有内容。 提示:使用 fs.mkdir()、fs.writeFile() 和 fs.rmdir()(fs.rmdir() 的 recursive 参数)。 ``` 6. 读取目录内容 ``` 编写一个 Node.js 脚本,读取指定目录下的所有文件和子目录的名称,并打印到控制台。 提示:使用 fs.readdir() 或 fs.readdirSync()。 ``` 7. 文件内容替换 ``` 编写一个 Node.js 脚本,读取一个文本文件(example.txt),将文件中的所有单词 "Node.js" 替换为 "JavaScript",然后将修改后的内容写回到原文件。 提示:使用 fs.readFile() 和 fs.writeFile(),结合正则表达式。 ``` 8. 文件复制 ``` 编写一个 Node.js 脚本,将一个文件(source.txt)的内容复制到另一个文件(destination.txt)中。 提示:可以使用 fs.copyFile() 或手动读取和写入文件。 ``` 9. 文件大小统计 ``` 编写一个 Node.js 脚本,计算指定目录下所有文件的总大小(以字节为单位)。 提示:使用 fs.readdir() 和 fs.stat()。 ``` 10. 文件备份 ``` 编写一个 Node.js 脚本,将指定目录下的所有文件备份到另一个目录中。备份文件的命名规则为:原文件名_备份时间戳。 提示:使用 fs.readdir()、fs.copyFile() 和 Date.now()。 ``` 11. 文件系统监控 ``` 编写一个 Node.js 脚本,监控指定目录的文件变化(如新增文件、删除文件、修改文件)。当检测到变化时,打印出变化的文件名和变化类型。 提示:使用 fs.watch() 或 fs.watchFile()。 ``` 12. 文件压缩与解压 ``` 编写一个 Node.js 脚本,完成以下任务: 将指定目录下的所有文件压缩为一个 .zip 文件。 解压一个 .zip 文件到指定目录。 提示:可以使用第三方模块(如 archiver 或 unzipper)。 ``` 13. 日志文件管理 ``` 编写一个 Node.js 脚本,实现一个简单的日志文件管理系统: 每天生成一个新的日志文件,文件名格式为 log_YYYYMMDD.txt。 将日志内容追加到当天的日志文件中。 提供一个命令行接口,允许用户输入日志内容。 提示:使用 fs.appendFile() 和 Date 对象。 ``` ### 四、http模块 1. 静态文件服务器 题目: ``` 使用Node.js的http模块和fs模块,创建一个简单的静态文件服务器。当用户访问服务器时,根据请求的路径返回对应的静态文件(如HTML、CSS、JavaScript文件)。如果请求的文件不存在,则返回404状态码和“文件未找到”的提示信息。 ``` 要求: ``` 服务器监听在本地的8080端口。 将静态文件放在一个名为public的目录中。 如果请求的文件是HTML文件,返回Content-Type为text/html;如果是CSS文件,返回Content-Type为text/css;如果是JavaScript文件,返回Content-Type为application/javascript。 如果请求的文件不存在,返回404状态码和“文件未找到”的提示信息。 ``` 2. 日志记录服务器 题目: ``` 使用Node.js的http模块和fs模块,创建一个HTTP服务器,记录每次请求的详细信息到日志文件中。日志文件应包含请求的时间戳、请求方法、请求路径和客户端IP地址。 ``` 要求: ``` 服务器监听在本地的5000端口。 每次请求时,将请求信息追加到一个名为server.log的日志文件中。 日志文件的格式为:[时间戳] - [请求方法] - [请求路径] - [客户端IP]。 提供一个简单的HTML页面作为响应,内容为“日志已记录”。 ``` 3. 图片查看器 题目: ``` 使用Node.js的http模块和fs模块,创建一个图片查看器服务器。用户可以通过访问/view?filename=图片名来查看指定的图片文件。 ``` 要求: ``` 服务器监听在本地的4000端口。 将图片文件放在一个名为images的目录中。 如果请求的图片存在,返回图片内容,并设置Content-Type为image/jpeg或image/png(根据文件扩展名判断)。 如果请求的图片不存在,返回404状态码和“图片未找到”的提示信息。 ``` 4. 文件搜索服务 题目: ``` 使用Node.js的http模块和fs模块,创建一个文件搜索服务。用户可以通过访问/search?query=关键词来搜索指定目录下的文件名是否包含关键词的文件。 ``` 要求: ``` 服务器监听在本地的8000端口。 搜索的目录为当前目录下的files文件夹。 返回一个JSON格式的响应,包含所有匹配的文件名。如果未找到匹配的文件,返回一个空数组。 ``` 示例响应: ```json { "files": ["example1.txt", "example2.txt"] } ``` 5. 简单Web服务 要求: ``` 在浏览器输入http://localhost:8080/时,会返回404,原因是程序识别出HTTP请求的不是文件,而是目录。请修改file_server.js,如果遇到请求的路径是目录,则自动在目录下依次搜索index.html、default.html,如果找到了,就返回HTML文件的内容。 ``` ### 五、Web开发 1. 使用Koa,从0开始打造一个极简风格的Web服务器 要求: ```bash 使用Koa; 使用8000端口; 输出服务运行地址信息; 更新端口号,能自动更新服务运行地址; ``` 2. 在开发时,改完代码总要结束程序,再启动程序有点麻烦,请使用nodemon来进行热重载 要求: ``` nodemon 全局安装 ``` 3. 使用koa-router,给我们第一步做的web服务应用集成路由功能 要求: ```js 使用 http://localhost:8000/ 返回“首页”字样 使用 http://localhost:8000/weixin 返回“微信”字样 使用 http://localhost:8000/alipay 返回“支付宝”字样 使用 http://localhost:8000/ds 返回“yyds”字样 ``` 4. 在第3题的基础上,如果有一个请求地址如:http://localhost:8000/app?code=5566,请问如何拿到code后面值?请编码实现 要求: ``` 连同code一起获取,演示用代码如何实现; 只要获取code的值,演示用代码如何实现; ``` 5. 在之前项目基础上,如果有post请求,要如何拿到请求过来的数据?请编码实现 ### 六、koa中间件 1. 编写一个 Koa 中间件,实现以下功能: - 拦截所有请求,并在控制台中输出请求的 URL 和 HTTP 方法。 - 如果请求路径是 `/`,则返回一个 `JSON` 格式的问候语。 - 如果请求路径是 `/users`,则调用一个模拟的数据库函数,返回一个包含用户信息的 JSON 数据。 要求: ``` 1. 输出的日志格式为 `[INFO] [时间] [方法] [URL]`。 2. `/users` 的 JSON 数据包括用户的 `id`, `name`, `email`。 3. 模拟数据库查询可以使用 `setTimeout` 模拟异步操作。 ``` 示例输出: 当访问 `/` 时: ``` [INFO] [2023-10-05 20:30:00] GET / ``` 返回值: ```json { "message": "Hello, Welcome to Koa!" } ``` 当访问 `/users` 时: ``` [INFO] [2023-10-05 20:30:00] GET /users ``` 返回值: ```json [ { "id": 1, "name": "Alice", "email": "alice@example.com" } ] ``` 2. 构建一个 Koa 中间件,实现以下功能: - 在请求到达最终处理逻辑之前,检查请求头是否包含指定的 `X-Auth-Token`。 - 如果请求头中存在有效的 `X-Auth-Token`,允许请求继续。 - 如果不存在或无效,返回状态码 `401 Unauthorized` 和错误信息。 要求: ``` 1. 模拟一个简单的 `X-Auth-Token` 有效性判断,假设有效的 token 为 `valid-token-123`。 2. 如果验证失败,返回的 JSON 格式为: ``` ```json { "error": "Unauthorized", "message": "Invalid or missing token" } ``` 提示: - 使用 `ctx.headers['x-auth-token']` 获取请求头中的值。 - 使用 `throws` 或 `ctx.status` 来发送错误状态码。 3. 设计一个 Koa 中间件链,实现以下功能: ``` 1. 请求日志中间件:记录所有请求的基本信息,包括 URL、方法、时间戳。 2. 数据格式化中间件:将请求体中的 JSON 数据转换为大写键格式(例如,将 `name` 改为 `NAME`)。 3. 路由处理中间件:根据请求路径 `/api/data` 返回处理后的数据。 ``` 要求: ``` 1. 请求日志的格式为 `[REQUEST] [时间] [方法] [URL]`。 2. 数据格式化中间件仅对 `POST` 请求生效。 3. `/api/data` 返回格式化的 JSON 数据。 ``` 示例输入(POST `/api/data`): ```json { "name": "John", "age": 30 } ``` 示例输出: ```json { "NAME": "John", "AGE": 30 } ```