前端面试题之NodeJS系列
目录
- 1、说说你对nodeJS的理解?优缺点?应用场景?
- 2、说说NodeJS有哪些全局对象
- 3、说说Node中的process的理解,有哪些常用的方法
- 4、说说Node中的fs模块的理解?有哪些常用的方法
- 5、说说对Node中的Buffer的理解?应用场景?
- 6、说说对Node中的Strem的理解?应用场景?
- 7、说说Node文件查找的优先级以及require方式的文件查找策略
- 8、说说你对中间件概念的理解
- 9、如何实现jwt鉴权机制。说说你的思路?
- 10、如果让你来设计一个分页功能,你会怎么设计?前后端如何交互
- 11、Node性能如何进行监控以及优化
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、内存管理优化
前端面试题之NodeJS系列相关推荐
- 前端学习(1833):前端面试题之nodejs的轮询机制
- 前端面试题之浏览器系列
目录 1.什么是XSS攻击 2.什么是CSRF攻击 3.有哪些可能会引起前端安全的问题 4.网络劫持有哪些,如何防范 5.如何实现浏览器内多个标签页之间的通信 6.浏览器的缓存机制的理解 7.浏览器资 ...
- 2021前端面试题系列:fetch与axios、浏览器内多个标签页面通信及安全问题
大家好,我是前端岚枫,今天主要跟大家分享我整理的笔记2021前端面试题系列:fetch与axios.浏览器内标签页之间的通讯方法.XSS 和CSRF以及如何防范,此方面内容在我们的工作中常用到, 也是 ...
- 「前端面试题系列7」Javascript 中的事件机制(从原生到框架)
前言 这是前端面试题系列的第 7 篇,你可能错过了前面的篇章,可以在这里找到: 理解函数的柯里化 ES6 中箭头函数的用法 this 的原理以及用法 伪类与伪元素的区别及实战 如何实现一个圣杯布局? ...
- 2021前端面试题系列:HTTP请求和HTTP缓存控制
大家好,我是前端岚枫,一枚二线城市的程序媛,今天主要跟大家分享我整理的笔记2021前端面试题系列:HTTP请求和HTTP缓存控制,此方面内容在我们的工作中常用到, 也是面试官经常提问的问题,希望下面文 ...
- 【前端面试题】—53道常见NodeJS基础面试题(附答案)
说到前端就不得不提到后端,我们给用户展示页面所需的数据正是从后端获取的,所以了解后端的运行原理和技术的实现很有必要. Node. js是一个不错的选择,它是基于JavaScript语法的一套服务器端( ...
- promise的状态以及api介绍_2019年,盘点一些我出过的前端面试题以及对求职者的建议
笔者虽然曾经也面试过很多求职者,但是对于前端的笔试和面试,我觉得并不能体现一个人的真实能力,所以建议大家多修炼前端真正的技术.对于前端面试题,之前也承诺过读者要出一篇,笔者大致总结一下曾经面试的题目. ...
- 前端周报:前端面试题及答案总结;JavaScript参数传递的深入理解
1.2017前端面试题及答案总结 |掘金技术征文 "金三银四,金九银十",用来形容求职最好的几个月.但是随着行业的饱和,初中级前端er就业形势不容乐观. 行业状态不可控,我们能做的 ...
- 前端面试题汇总(JavaScript面试纯干货)
前端面试题汇总(JavaScript面试纯干货) 1 闭包 闭包就是能够读取其他函数内部变量的函数 闭包是指有权访问另⼀个函数作⽤域中变量的函数,创建闭包的最常⻅的⽅式就是在⼀个函数内创建另⼀个函数, ...
最新文章
- python模板是什么意思_什么是最快的Python模板系统?
- 【软考-软件设计师】计算机存储系统
- 【操作系统】进程间通信的五种方式
- IOS UIViewController的生命周期
- android -------- java虚拟机和Dalvik虚拟机
- gdb调试时,Program received signal SIGPIPE, Broken pipe.
- “拼木头”算法挑战赛:禁忌搜索算法,用Javascript 跑
- python的随机种子实例
- 浏览器提取已安装扩展教程
- Ace Admin前端框架笔记二导航栏Navba
- 计算机仿真实训平台软件,虚拟仿真实验室软件有哪些
- MEMS传感市场,美/日/德企占主导地位
- 【verbs】ibv_get_device_name()|ibv_get_device_list()
- Matplotlib取代minitab绘制正态分布图
- vue 前端JS实现文字转语音功能
- macOS High Sierra 10.13.6 英伟达显卡Nvidia显卡 失效处理方案
- 记war exploded部署不成功
- 题目1:输入两个整数A和B,输出它们的和。
- UOS将字体制作成软件包,可双击安装
- 手游直播到底难在哪里?
热门文章
- ERROR in ch.qos.logback.core.joran.action.AppenderRefAction - See http://logback.qos.ch/codes.html#a
- 解决FTP服务器密码正确却登不上的问题
- nginx格式化工具
- 收集的20个媒体转换软件|视频处理|音频处理(有图哦)
- 中国石油大学《商务礼仪系列》在线考试题
- 将电脑内存插入其他未知导致开机报警
- 咸鱼洽谈(linux三剑客之一grep)美好的周五生活开始了~
- 浅谈我用过的有限元软件-第一弹
- 2021-11-04太空大战项目制作
- UI组件Kendo UI for jQuery数据管理入门指南 - TaskBoard/卡片