Node面试整理

作者: Luciena | 来源:发表于2018-12-27 14:49 被阅读16次

    Node的优缺点?

    优点

    • 使用js语法,简单,强大,轻量,可扩展
    • 强大体现在非阻塞IO,可以适应分块传输数据,较慢的网络环境,尤其擅长高并发访问
    • 轻量体现在node本身既是代码,又是服务器,前后端使用统一语言
    • 可扩展体现在可以轻松应对多实例,多服务器架构,同时有海量的第三方应用组件

    缺点

    • 不适合CPU密集型应用
    • CPU密集型应用给Node带来的挑战主要是:由于JavaScript单线程的原因,如果有长时间运行的计算(比如大循环),将会导致CPU时间片不能释放,使得后续I/O无法发起;
    • 解决方案:分解大型运算任务为多个小任务,使得运算能够适时释放,不阻塞I/O调用的发起;
    • 只支持单核CPU,不能充分利用CPU
    • 解决方案:多服务
    • 可靠性低,一旦代码某个环节崩溃,整个系统都崩溃
    • 原因:单进程
    • 解决方案:
    • (1)Nnigx反向代理,负载均衡,开多个进程,绑定多个端口;
    • (2)开多个进程监听同一个端口,使用cluster模块;
    • 开源组件库质量参差不齐,更新快,向下不兼容

    Koa ?

    • 就是一种简单好用的 Web 框架。它的特点是优雅、简洁、表达力强、自由度高。本身代码只有1000多行,所有功能都通过插件实现,很符合 Unix 哲学。
    • Koa 2.0 与 Koa 1.x 版本的最大区别就是使用了 ES7 中 Async/Await 的特性,代替了 co 的 Generator Function,好处是摆脱了 co 的“暧昧”实现方法,改而使用原生的 Coroutine-like(maybe) 语法。缺点是与从 connect/express 迁移到 Koa 1.x 一样,很弱的向前兼容,需要用一个 wrapper 来继续使用 1.x 的中间件
    • 在于 handler 的处理方法,express 是普通的回调函数, koa 是利用ES7 中 Async/Await 的特性,没有回调,没有回调,就大大加速了开发速度这一点而言,已经足以让我们跪舔了
    • koa是中间件模式,执行到next的时候,会去调用下一个中间件,下个中间件执行完再接着执行上个中间件next下面的代码
    • koa把 request, response 封装到了同一个上下文对象 content

    什么是RESTful架构?

    • 每一个URI代表一种资源
    • 客户端和服务器之间,传递这种资源的某种表现层
    • 客户端通过四个HTTP动词,对服务器端资源进行操作,实现"表现层状态转化"

    什么是错误优先的回调函数?

    错误优先的回调函数(Error-First Callback)用于同时返回错误和数据。第一个参数返回错误,并且验证它是否出错;其他参数用于返回数据。

    fs.readFile(filePath, function(err, data) { 
      if (err) { 
        // 处理错误 
        return console.log(err);
      } 
       console.log(data); 
    });
    

    如何避免回调地狱?

    如何让node监听80端口?

    • 借助 nginx

    • sudo

    一次完整的HTTP请求所经历的7个步骤?

    HTTP通信机制是在一次完整的HTTP通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤:

    **建立TCP连接 **

    • 在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接,该连接是通过TCP来完成的,该协议与IP协议共同构建Internet,即著名的TCP/IP协议族,因此Internet又被称作是TCP/IP网络。HTTP是比TCP更高层次的应用层协议,根据规则,只有低层协议建立之后才能进行更高层协议的连接,因此,首先要建立TCP连接,一般TCP连接的端口号是80。

    **Web浏览器向Web服务器发送请求命令 **

    • 一旦建立了TCP连接,Web浏览器就会向Web服务器发送请求命令。例如:GET/sample/hello.jsp HTTP/1.1。

    **Web浏览器发送请求头信息 **

    • 浏览器发送其请求命令之后,还要以头信息的形式向Web服务器发送一些别的信息,之后浏览器发送了一空白行来通知服务器,它已经结束了该头信息的发送。

    **Web服务器应答 **

    • 客户机向服务器发出请求后,服务器会客户机回送应答, HTTP/1.1 200 OK ,应答的第一部分是协议的版本号和应答状态码。

    **Web服务器发送应答头信息 **

    • 正如客户端会随同请求发送关于自身的信息一样,服务器也会随同应答向用户发送关于它自己的数据及被请求的文档。

    **Web服务器向浏览器发送数据 **

    • Web服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据。

    **Web服务器关闭TCP连接 **

    一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者服务器在其头信息加入了这行代码:Connection:keep-alive

    • TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。

    什么是HTTP,TCP,UDP?

    关系

    TCP/IP是个协议组,可分为四个层次:网络接口层、网络层、传输层和应用层。

    在网络层有IP协议、ICMP协议、ARP协议、RARP协议和BOOTP协议。

    在传输层中有TCP协议与UDP协议。

    在应用层有HTTP,FTP、TELNET、SMTP、DNS等协议。

    HTTPS通信原理

    HTTPS(Secure Hypertext Transfer Protocol)安全超文本传输协议 它是一个安全通信通道

    HTTPS是HTTP over SSL/TLS,HTTP是应用层协议,TCP是传输层协议,在应用层和传输层之间,增加了一个安全套接层SSL/TLS:

    • SSL (Secure Socket Layer,安全套接字层)

    • TLS (Transport Layer Security,传输层安全协议)

    • SSL使用40 位关键字作为RC4流加密算法

    (加密的是path/body)

    Https的作用

    • 内容加密 建立一个信息安全通道,来保证数据传输的安全;
    • 身份认证 确认网站的真实性
    • 数据完整性 防止内容被第三方冒充或者篡改

    HTTP(HyperText Transfer Protocal, 超文本传输协议)无状态、HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。

    TCP(Transmission Control Protocol,传输控制协议)是基于连接的协议,也就是说,在正式收发数据前,必须和对方建立可靠的连接。一个TCP连接必须要经过三次“对话”才能建立起来,其中的过程非常复杂,我们这里只做简单、形象的介绍,你只要做到能够理解这个过程即可。我们来看看这三次对话的简单过程:主机A向主机B发出连接请求数据包:“我想给你发数据,可以吗?”,这是第一次对话;主机B向主机A发送同意连接和要求同步(同步就是两台主机一个在发送,一个在接收,协调工作)的数据包:“可以,你什么时候发?”,这是第二次对话;主机A再发出一个数据包确认主机B的要求同步:“我现在就发,你接着吧!”,这是第三次对话。三次“对话”的目的是使数据包的发送和接收同步,经过三次“对话”之后,主机A才向主机B正式发送数据。

    UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去!
    UDP适用于一次只传送少量数据、对可靠性要求不高的应用环境。比如,我们经常使用“ping”命令来测试两台主机之间TCP/IP通信是否正常,其实“ping”命令的原理就是向对方主机发送UDP数据包,然后对方主机确认收到数据包,如果数据包是否到达的消息及时反馈回来,那么网络就是通的。例如,在默认状态下,一次“ping”操作发送4个数据包(如图2所示)。大家可以看到,发送的数据包数量是4包,收到的也是4包(因为对方主机收到后会发回一个确认收到的数据包)。这充分说明了UDP协议是面向非连接的协议,没有建立连接的过程。正因为UDP协议没有连接的过程,所以它的通信效果高;但也正因为如此,它的可靠性不如TCP协议高。QQ就使用UDP发消息,因此有时会出现收不到消息的情况。

    tcp协议和udp协议的差别

    差别 | TCP | UDP
    ---- | ----- | ----- | -----
    是否连接 | 面向连接 | 面向非连接
    传输可靠性 | 可靠 | 不可靠
    应用场合 | 传输大量数据 | 少量数据
    速度 | 慢 | 快

    Node的中间件模式?

    中间件 在 Node.js 中被广泛使用,它泛指一种特定的设计模式、一系列的处理单元、过滤器和处理程序。以函数的形式存在,连接在一起,形成一个异步队列,来完成对任何数据的预处理和后处理。

    横向处理

    灵活性:使用中间件我们用极少的操作就能得到一个插件
    扩展性:用最简单的方法就能将新的过滤器和处理程序扩展到现有的系统上

    • koa-bodyparser
      ** 用来解析body的中间件,ctx.request中可以获取到对象形式的数据
      ** xml数据没办法通过koa-bodyparse解析,有另一个中间件koa-xml-body

    • koa-logger

    • 用来打印一些请求日志

    • koa2-cors

    • 允许跨域请求

    • koa-jwt

    • 校验token

    • koa-router

    • 配置路由

    • crypto

    • 加密数据(用户密码)

    • 对称加密(Symmetric Cryptography)

    • 对称加密是最快速、最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key)。对称加密有很多种算法,由于它效率很高,所以被广泛使用在很多加密协议的核心当中

    • 选择了Rijndael算法

    • 非对称加密(Asymmetric Cryptography)

    • 非对称加密为数据的加密与解密提供了一个非常安全的方法,它使用了一对密钥,公钥(public key)和私钥(private key)。私钥只能由一方安全保管,不能外泄,而公钥则可以发给任何请求它的人。非对称加密使用这对密钥中的一个进行加密,而解密则需要另一个密钥。比如,你向银行请求公钥,银行将公钥发给你,你使用公钥对消息加密,那么只有私钥的持有人--银行才能对你的消息解密。与对称加密不同的是,银行不需要将私钥通过网络发送出去,因此安全性大大提高

    • 目前最常用的非对称加密算法是RSA算法

    Promise的用法?

    状态?

    • pending (正在处理)

    • reslove(正确返回)

    • reject(错误返回)

    方法?

    • Promise.all([PromiseA, PromiseB]).then((resultA, resultB)=> {})

    • 需等待多个异步方法成功相应

    • Promise.race([PromiseA, PromiseB]),then(resultA => {})

    • 按结束时间只选择最快的结果

    async/await?

    使用 async / await, 搭配 promise, 可以通过编写形似同步的代码来处理异步流程, 提高代码的简洁性和可读性.

    匿名函数、闭包?

    匿名函数

    • 通过表达式的自我执行
    // 自我执行
    (function (num){
        alert(num);
    })(100);
    

    闭包

    • 闭包指有权访问另一个函数作用域里变量的函数

    • 使用闭包的优点(缺点),可以把局部变量驻留在内存中,避免使用全局变量(全局变量污染导致应用程序不可预测性,每个模块都可调用容易发生错误,所以推荐使用私有的,封装的局部变量)

    //函数里放一个匿名函数---闭包
    function box (){
        return function(){
            return 'Lee';
        }
    }
    alert(box); //function box(){return function(){return 'Lee'}}
    alert(box());//function (){return 'Lee'}
    alert(box()());//Lee
    

    关于this指向

    this对象是在运行时基于函数的执行环境绑定的,如果this在全局范围就是window,如果是在对象内部,就指向这个对象,而闭包却是在运行时指向window的,因而闭包不属于这个对象的属性或方法。

    MongoDB的优缺点?

    优点

    • 高性能

    • 高可用性

    • 易扩展性

    • 丰富的查询语言,支持动态查询以及查询记录分析

    • 面向文档存储(BSON,类JSON数据模式简单而强大)

    • 查询与索引方式灵活,是最像SQL的Nosql

    • 全索引支持,扩展到内部对象和内嵌数组

    • 高效存储二进制大对象 (比如照片和视频)

    • 复制和故障切换支持

    • Auto- Sharding自动分片支持云级扩展性

    • MapReduce 支持复杂聚合

    缺点

    • 不支持事务(进行开发时需要注意,哪些功能需要使用数据库提供的事务支持)
    • MongoDB占用空间过大 (不过这个确定对于目前快速下跌的硬盘价格来说,也不算什么缺点了)
    • MongoDB没有如MySQL那样成熟的维护工具,这对于开发和IT运营都是个值得注意的地方
    • 在32位系统上,不支持大于2.5G的数据(很多操作系统都已经抛弃了32位版本,所以这个也算不上什么缺点了,3.4版本已经放弃支持32 位 x86平台)
    • 大数据量持续插入,写入性能有较大波动
    • 单机可靠性比较差
    • 在集群分片中的数据分布不均匀

    MongoDB支持存储过程吗?如果支持的话,怎么用?

    • MongoDB支持存储过程,它是javascript写的,保存在db.system.js表中

    关系型数据库与非关系型数据库的区别?

    • NoSQL是非关系型数据库,NoSQL = Not Only SQL。
    • 关系型数据库采用的结构化的数据,NoSQL采用的是键值对的方式存储数据。
    • 在处理非结构化/半结构化的大数据时;在水平方向上进行扩展时;
    • 随时应对动态增加的数据项时可以优先考虑使用NoSQL数据库。
    • 在考虑数据库的成熟度;支持;分析和商业智能;管理及专业性等问题时,应优先考虑关系型数据库。

    条件查询符?

    • $gt ---- > (greater than)
    • $lt ---- < (less than)
    • $gte ---- >= (greater than equal)
    • $lte ---- <= (less than equal)
    • $ne ---- != 、<> (not equal)
    • $in ---- in
    • $nin ---- not in
    • $all ---- all
    • $or ---- or
    • $not ---- 反匹配

    为什么MongoDB的数据文件很大?

    • MongoDB采用的预分配空间的方式来防止文件碎片。

    当更新一个正在被迁移的块(Chunk)上的文档时会发生什么?

    • 更新操作会立即发生在旧的块(Chunk)上,然后更改才会在所有权转移前复制到新的分片上。

    MongoDB在A:{B,C}上建立索引,查询A:{B,C}和A:{C,B}都会使用索引吗?

    • 不会,只会在A:{B,C}上使用索引。

    如果一个分片(Shard)停止或很慢的时候,发起一个查询会怎样?

    • 如果一个分片停止了,除非查询设置了“Partial”选项,否则查询会返回一个错误。如果一个分片响应很慢,MongoDB会等待它的响应。

    Redis

    简介

    Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。

    Redis 与其他 key - value 缓存产品有以下三个特点:

    • Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
    • Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
    • Redis支持数据的备份,即master-slave模式的数据备份。

    Redis 优势

    • 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
    • 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
    • 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
    • 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

    Redis与其他key-value存储有什么不同?

    • Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
    • Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。

    如何优化并发?

    • node
    • 异步非阻塞
    • redis
    • 开多个线程
    • 对数据库操作
    • 加索引
    • 线程池
    • 拆表

    进程的管理工具?

    pm2、supervisor、nodemon

    数据库都有哪些?

    • 关系型数据库

      • mysql 、SQL Server、Oracle、Sybase、DB2
    • 非关系型数据库

      • mongoDB、Redis

    什么是事件循环?

    查找算法?

    排序算法?

    JS经典面试题?

    MYSQL的事务隔离?

    async/await/yield?

    Mysql及Mongodb?

    JS的对象,原型,继承?

    消息队列的使用场景?

    Promise是怎么实现的?

    引擎?

    数据库表的设计规范?

    并行与并发?

    SQL语法?

    相关文章

      网友评论

        本文标题:Node面试整理

        本文链接:https://www.haomeiwen.com/subject/shjrlqtx.html