Node面试整理

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语法?

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容