# node-learn **Repository Path**: mxydl2009/node-learn ## Basic Information - **Project Name**: node-learn - **Description**: 拉勾前端训练营part5-1作业 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-03-21 - **Last Updated**: 2021-06-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 简答题 1. 简述 Node.js 的特点以及适用的场景 Node.js的特点如下: - Node.js是一个JavaScript运行时环境, 依赖于V8引擎进行代码执行 - 主线程为单线程,因此以事件驱动的模式来进行任务调度 - 非阻塞I/O,可以应对密集型I/O请求 适用场景: - 适用于高并发的场景 - 适用于密集型I/O请求场景 2. 简述 Buffer 的使用.包括多种创建方式。实例方法,静态方法。 Buffer是用来处理缓冲区的专用API,用于创建缓冲区,操作缓冲区数据的场景。 创建方式: - Buffer.alloc():请求一块干净的内存空间作为缓冲区 - Buffer.allocUnsafe():请求一块内存空间作为缓冲区,但不一定是干净的 - Buffer.from():从其他类型数据生成一个新的Buffer 实例方法: - Buffer.prototype.fill():将数据填充到缓冲区 - Buffer.prototype.indexOf():获取缓冲区中某个数据的索引 - Buffer.prototype.slice():切割缓冲区的一部分作为新的缓冲区返回,但不改变原来的缓冲区 - Buffer.prototype.toString():将缓冲区的二进制数据根据一定的编码规则转换为字符串 - Buffer.prototype.copy():拷贝缓冲区数据到新的缓冲区并返回新缓冲区 静态方法: - Buffer.concat():将传入的数组转换为新的缓冲区返回 - Buffer.isBuffer():判定传入的数据是否是缓冲区类型 3. 写出5个以上文件操作的API,并且用文字说明其功能。 - fs.createReadStream(path[, options]): 创建文件可读流 - fs.createWriteStream(path[, options]): 创建文件可写流 - fs.stat(path[, options], callback): 返回表示文件各方面信息的对象 - fs.read(fd, buffer, offset, length, position, callback): 根据文件标识fd来从文件读取数据 - fs.write(fd, buffer[, offset[, length[, position]]], callback): 根据文件标识fd将数据写入文件 4. 简述使用流操作的优势,以及Node中流的分类。 流操作是为了解决读写速度不一致、大文件的内存占用率太高的问题而提出的解决方案,使用流操作,可以用流的模式读取数据、写入数据,而不需要占用大量内存,也不需要一次性读取和写入,在空间和时间上节省资源,提高效率。 5. 在数据封装与解封装过程中,针对应用层、传输层、网络层、数据链路层、物理层5层分别做了什么事情? 数据封装和解封过程中,在各层分别有如下操作: - 应用层: - 封装:将数据封装在对应的应用层协议数据体中,添加应用层协议的协议头,如HTTP协议的请求头和请求体(数据通常封装在请求体) - 解封:通过协议规范,将协议头和数据体拆分,数据从协议数据体中提取 - 传输层 - 封装:将应用层数据报封装在数据包的数据体中,添加传输层协议头,如TCP首部 - 解封:将协议头和数据体拆分,根据协议头的信息来将数据体交给应用层来处理 - 网络层: - 封装:将传输层的数据报封装在网络层的数据体中,添加网络层协议头,如IP首部 - 解封:将协议头和数据体拆分,根据协议头的信息来将数据体交给传输层来处理 - 数据链路层: - 封装:将网络层的数据报封装在数据链路层的数据体中,添加数据链路层协议头,如MAC地址等信息 - 解封:将协议头和数据体拆分,根据协议头的信息来将数据体交给网络层来处理 - 物理层: - 封装:物理层负责将数字信号转换为电信号发送 - 解封:物理层负责将接收的电信号转换为数字信号 # 代码题 1. 统计指定目录中文件总大小。要考虑目录中还有子目录的情况。可以同步编码,异步更好。 见calculateDirSize.js 2. 编写单向链表类并且实现队列的入列出列操作。 见linkedList-Queue.js 3. 基于Node写出一静态服务器。接收请求并且响应特定目录(服务器目录)中的html、css、js、图片等资源。 见static-server文件夹