前端面试题之NodeJS系列

1、说说你对nodeJS的理解?优缺点?应用场景?

nodeJS是一个服务器端的,非阻塞式I/o的、事件驱动的JavaScript运行环境。

非阻塞I/O,是指NodeJS采用非阻塞I/O机制,在做I/O操作的时候不会造成任何的阻塞,当完成之后,以时间的形式通知执行操作。
事件驱动,当进来一个新的请求的时候,请求将会被压入一个事件队列中,然后通过循环来检测队列中的事件状态变化,如果检测到有状态变化的事件,那么就执行该事件对应的处理代码,一般都是回调函数。

优点

处理高并发场景性能更佳;

适合I/O密集型应用;

缺点

不支持CPU密集型应用;

只支持单核CPU,不能充分利用CPU;

可靠性低,一旦代码某个环节奔溃,整个系统都会奔溃

【应用场景】:

  • 善于I/O,不善于计算。因为Node.JS最擅长的就是任务调度,如果业务有很多的CPU计算,实际上也相当于这个计算阻塞了这个单线程,就不太合适Node开发,但是也不是没有解决方案,只是说不太适合。
  • 当应用程序需要处理大量并发的I/O,而在向客户端发出响应之前,应用程序内部并不需要进行非常复杂的处理的时候,Node.js非常合适。

【具体场景】:

1、用户表单收集系统,后台管理系统,实时交互系统,考试系统,联网软件,高并发量的web应用程序;

2、基于web、canvas等多人联网游戏;

3、基于web的多人实时聊天客户端、聊天室、图文直播;

4、单页面浏览器应用程序

2、说说NodeJS有哪些全局对象

在浏览器Javascript中,通常window是全局对象,而NodeJS中的全局对象是globa

1、真正的全局对象:

Class:Beffer;可以处理二进制以及非Unicode编码的数据

process;进程对象,提供有关当前进程的信息和控制

console;打印

  • 最常用的输入内容的方式:console.log
  • 清空控制台 console.clear
  • 打印函数的调用栈:console.trace

clearInterval、clearTimeout、setInterval、setTimeout,定时器和清除定时器

2、模块级别的全局对象

__dirname 获取当前文件所在的路径,不包括后面的文件名;

__filename 获取当前文件所在的路径,包括后面的文件名称;

exports,一个模块所导出的内容

module 对当前模块的引用;

require,用于引入模块

3、说说Node中的process的理解,有哪些常用的方法

process,进程对象,提供了有关当前NodeJS进程的信息并对其进行控制,作为一个全局变量。

process.env;返回一个对象,存储当前环境相关的所有信息,一般很少直接用到

process.pid;获取当前进程id

process.ppid;当前进程对应的父进程

process.cwd;获取当前进程的工作目录

process.uptime();当前进程已运行时间

process.stdout 标准输出 /process.stdin标准注入/process.stderr标准错误输出/process.title指定进程名称

process.platform 获取当前进程运行的操作系统平台;

process.nextTick 定义一个动作,并且让这个动作在下一个事件轮询的时间点上执行

4、说说Node中的fs模块的理解?有哪些常用的方法

fs,该模块是提供本地文件的读写能力,基本上是POSIX文件操作命令的简单包装,可以说,所有与文件的操作都是通过fs核心模块实现。

  • 文件读取

    1、同步读取 fs.readFileSync("1.txt","utf8")

    第一个参数为读取文件的路径或文件描述符;

    第二个参数为potions,默认值为null,其中有encoding和flag(标识为,默认为r),也可以直接传入encoding

    2、异步读取 fs.readFile()

    参数与同步读取前两个参数相同,最后一个参数为回调函数,函数内只有两个参数err(错误)和data(数据),该方法没有返回值,回调函数在读取文件成功后执行

  • 文件写入

    1、同步写入 fs.writeFileSync

    • 第一个参数为写入文件的路径或文件描述符
    • 第二个参数为写入的数据,类型为 String 或 Buffer
    • 第三个参数为 options,默认值为 null,其中有 encoding(编码,默认为 utf8)、 flag(标识位,默认为 w)和 mode(权限位,默认为 0o666),也可直接传入 encoding

    2、异步写入 fs.writeFile

    异步写入,writeFile 与 writeFileSync 的前三个参数相同,最后一个参数为回调函数,函数内有一个参数 err(错误),回调函数在文件写入数据成功后执行

  • 文件追加写入
    1、同步追加 fs.appendFileSync

  • 第一个参数为写入文件的路径或文件描述符

  • 第二个参数为写入的数据,类型为 String 或 Buffer

  • 第三个参数为 options,默认值为 null,其中有 encoding(编码,默认为 utf8)、 flag(标识位,默认为 a)和 mode(权限位,默认为 0o666),也可直接传入 encoding

    2、异步追加 fs.appendFile

    异步追加写入方法 appendFile 与 appendFileSync 的前三个参数相同,最后一个参数为回调函数,函数内有一个参数 err(错误),回调函数在文件追加写入数据成功后执行


  • 文件拷贝
    1、同步拷贝 同步拷贝 fs.copyFileSync
    在这里插入图片描述
    把 3.txt 拷贝到 4.txt 中

    2、异步拷贝 fs.copyFile
    在这里插入图片描述

  • 创建目录
    1、同步创建 fs.mkdirSync
    参数为一个目录的路径,没有返回值,在创建目录的过程中,必须保证传入的路径前面的文件目录都存在,否则会抛出异常
    在这里插入图片描述
    2、异步创建 fs.mkdir

    第二个参数为回调函数
    在这里插入图片描述

5、说说对Node中的Buffer的理解?应用场景?

在Node应用中,需要处理网络协议,操作数据库,处理图片,接收上传文件等,在网络流和文件的操作中,要处理大量的二进制数据,而Buffer就是在内存中开辟的一片区域(初始化为8KB,用来存放二进制数据)

【使用方法】:

1、Buffer.from()

2、Buffer.alloc()

上面创建Buffer后,能够toString的形式进行交互,默认情况下采取utf8字符编码形式。

【应用场景】:

1、I/o,通过流的形式,将一个文件的内容读取到另外一个文件

2、压缩与解压

3、加密解密

6、说说对Node中的Strem的理解?应用场景?

steam流,是数据传输手段,是端到端信息交换的一种方式,而且是有顺序的,是逐块读取数据,处理内容,用于顺序读取输入或写入输出。

【种类】:

可写流rquest、可读流response、双工流fs、转换流

常见的应用场景有:

  • get请求返回文件给客户端
  • 文件操作
  • 一些打包工具的底层操作

7、说说Node文件查找的优先级以及require方式的文件查找策略

  • 缓存中的模块优先级最高

  • 如果是内置模块,则直接返回

  • 如果是绝对路径 /开头,就从根目录找

  • 如果是相对路径 ./开头,则从当前require文件相对位置找

  • 如果文件没有携带后缀,就以.js > .json,node按顺序查找

  • 如果没有 .js文件/ .json文件,那么就会直接找相应的文件夹下面的package.json中的“main”的文件,也就是会去找app.js,默认情况下是index.js
    在这里插入图片描述

  • 如果文件为第三方模块,则会引入node_modules文件,如果不在当前仓库文件中,则自动从上级递归查找,直到根目录

8、说说你对中间件概念的理解

中间件是介于应用系统和系统软件之间的一类软件,它使用系统软件所提供的基础服务,衔接网络上应用系统的各个部分或不同的应用,能够达到资源共享,功能贡献的目的。

在ndoeJS中,中间件主要是指封装http请求细节处理的方式。例如在express、koa框架等web框架中,中间件的本质是一个回调函数,参数包括请求对象、响应对象和执行下一个中间件的函数。可以在这些中间件函数中,我们可以执行业务逻辑代码,修改请求和响应对象,返回响应数据等操作。

9、如何实现jwt鉴权机制。说说你的思路?

jwt,它本质就是一个字符串书写规范,作用是用来在用户和服务器之间传递安全可靠的信息

在目前前后端分离的开发过程中,使用token鉴权机制用于身份验证是最常见的方案,流程如下:

  • 服务器当验证用户账户和密码正确的时候,给用户颁发一个令牌,这个令牌作为后续用户访问一些接口的凭证;生成token:借助第三方库jsonwebtoken
  • 后续访问会根据这些令牌判断用户是否有权访问;验证token:使用koa-jwt中间件进行验证

Token,分成了三部分,头部Header,载荷Payload、签名Signature拼接。其中头部和载荷都是以JSON格式存放数据,只是进行了编码。

  • 头部header 主要声明使用的算法
  • 载荷payload 存放实际的内容
  • 签名Signature 对头部和载荷内容进行签名加密

优点:

  • json具有通用性,所以可以跨语言;
  • 组成简单,字节占用小,便于传输;
  • 服务端无需保存会话信息,很容易进行水平扩展
  • 一处生成,多处使用,可以在分布式系统中,解决单点登录问题
  • 可防护CSRF攻击

缺点:

  • payload部分仅仅是进行简单编码,所以只能用于存储逻辑必需的非敏感信息;
  • 需要保护好加密密钥,一旦泄漏后果不堪设想
  • 为避免token被劫持,最好使用https协议

10、如果让你来设计一个分页功能,你会怎么设计?前后端如何交互

前端向后端发送目标的页码page以及每页显示数据的数量pageSize,默认情况每次取10条数据,则每一条数据的起始位置start为
const start = (page-1) * pageSize

当确定好了limit和start之后,就可以写确定SQL语句

const sql = SELECT * FROM record limit ${pageSize} OFFSET ${start}

上述SQL语句表达的意思为,截取start到sart+pageSize之间的数据。

后端执行SQL语句,查询数据库,返回总数量,总页数,当前页,当前页数据给前端

11、Node性能如何进行监控以及优化

Node做为一门服务端语言,性能方面尤为重要,其衡量指标一般如下:CUP、内存、I/O、网络

如何监控——采用Easy-Monitor 2.0,是轻量级的NodeJS项目内核性能监控+分析工具

【如何优化】:

1、使用最新版本的NodeJS

2、正确使用流Stream

在Node中,很多对象都实现了流,对于一个大文件可以通过流的形式发送,不需要将其完全读入内存

3、代码层面优化

合并查询,将多次查询合并一起,减少数据库的查询次数

4、内存管理优化

Node.js在前端面试中经常被提及,以下是一些常见的面试问题和回答: 1. 你对Node.js的理解是什么? Node.js是一个基于Chrome V8引擎的JavaScript运行时环境,可以用于构建高性能、可扩展的网络应用程序。它使用单线程和非阻塞I/O模型,适用于处理并发的I/O密集型任务。 2. Node.js的优点和缺点是什么? Node.js的优点包括高性能、可扩展性、异步编程模型、丰富的包管理器等。缺点包括CPU计算能力受限、单线程可能导致阻塞等。 3. Node.js适用于哪些应用场景? Node.js适用于需要处理大量并发的I/O操作,例如实时聊天应用、实时数据推送、物联网、代理服务器等。 4. Node.js有哪些全局对象? 例如,`process`对象用于访问进程相关信息,`fs`模块用于文件系统操作,`Buffer`用于处理二进制数据,`stream`模块用于处理流数据等。 5. process对象在Node.js中的作用是什么? process对象提供了许多方法和属性,用于管理Node.js进程,例如获取命令行参数、设置环境变量、退出进程等。 6. fs模块在Node.js中的作用是什么? fs模块用于处理文件系统操作,例如读取文件、写入文件、删除文件、创建目录等。 7. Buffer在Node.js中的作用是什么? Buffer用于处理二进制数据,例如在网络传输中,可以使用Buffer来读取和写入数据。 8. stream在Node.js中的作用是什么? Stream模块用于处理流数据,可以在读取和写入大型数据时提供高效的内存管理。 9. Node.js文件查找的优先级和require方式的文件查找策略是什么? Node.js文件查找的优先级是先查找缓存,然后查找内置模块,再查找文件模块或文件夹中的package.json,最后查找index.js或index.json。require方式的文件查找策略是先查找node_modules文件夹中的模块,然后逐级向上查找。 10. 中间件是什么概念? 中间件是位于客户端和服务器之间的一个处理请求和响应的环节,可以对请求和响应进行处理和转换。 11. 如何实现JWT鉴权机制? JWT鉴权机制可以通过在服务端生成一个带有用户信息和签名的令牌,并在客户端将令牌存储起来。每次请求时,客户端将令牌发送给服务端,服务端校验令牌的合法性并解析用户信息。 12. 如何设计分页功能,前后端如何交互? 分页功能可以通过在服务端查询数据时设置偏移量和限制数量来实现,客户端可以向服务端发送包含页码和每页数量的请求参数。服务端根据请求参数计算出偏移量和限制数量,从数据库中获取相应的数据返回给客户端。 13. Node.js性能监控和优化可以通过使用性能分析工具和调优技术来实现,例如使用Node.js内置的`profiler`模块进行性能分析,使用缓存和异步编程模型来提高性能,使用负载均衡和集群来实现扩展等。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [前端面试题NodeJS系列](https://blog.csdn.net/qq_48701993/article/details/127223784)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

*neverGiveUp*

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值