十万字前端面试问题总结 - 第4部分

2023.03.09 - 2023.03.15 更新收集面试问题(45道题)【第4部分】
获取更多面试问题可以访问
github 地址: https://github.com/pro-collection/interview-question/issues
gitee 地址: https://gitee.com/yanleweb/interview-question/issues

目录:

中级开发者相关问题【共计 2 道题】

73.express middleware 工作原理是什么??【Nodejs】

express middleware 工作原理是什么?

Express middleware 的工作原理是通过拦截 HTTP 请求,对请求进行处理,然后将请求传递给下一个中间件或应用程序的路由处理。在 Express 中,中间件可以是一个或多个函数,每个函数都可以对请求进行操作或响应,从而实现对请求的处理和过滤。

当 Express 应用程序接收到一个 HTTP 请求时,请求将首先被传递给第一个注册的中间件函数。这个中间件函数可以对请求进行操作,例如修改请求的头信息、检查请求是否包含有效的身份验证令牌等等。当这个中间件函数完成操作后,它可以选择将请求传递给下一个中间件函数,或者直接将响应返回给客户端。

如果中间件函数选择将请求传递给下一个中间件函数,它可以调用 next() 函数来将控制权传递给下一个中间件。这个过程可以一直持续到所有中间件函数都被执行完毕,最后将请求传递给应用程序的路由处理函数。

通过使用中间件,开发人员可以将应用程序的功能模块化,从而实现更好的代码组织和可维护性。同时,中间件还可以实现各种功能,例如身份验证、日志记录、错误处理等等,从而为应用程序提供更丰富的功能和更好的用户体验。

它的设计模式是啥?写一个简单的示例呢

Express middleware 的设计模式是基于责任链模式。在责任链模式中,每个对象都有机会处理请求,并将其传递给下一个对象,直到请求被完全处理为止。在 Express 中,每个中间件函数都有机会对请求进行处理,并可以选择将请求传递给下一个中间件函数或应用程序的路由处理函数。

以下是一个简单的示例,演示如何使用 Express middleware 实现身份验证:

const express = require('express');
const app = express();

// 定义一个中间件函数,用于验证用户身份
function authenticate(req, res, next) {
  const token = req.headers.authorization;
  if (token === 'secret-token') {
    // 如果令牌有效,则将控制权传递给下一个中间件函数
    next();
  } else {
    // 否则,返回 401 错误
    res.status(401).send('Unauthorized');
  }
}

// 注册中间件函数,用于验证用户身份
app.use(authenticate);

// 定义一个路由处理函数,用于返回受保护的资源
app.get('/protected', (req, res) => {
  res.send('Protected resource');
});

// 启动应用程序
app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

在上面的示例中,我们定义了一个名为 authenticate 的中间件函数,它用于验证用户的身份。在这个函数中,我们检查请求头中是否包含有效的身份验证令牌。如果令牌有效,则将控制权传递给下一个中间件函数或路由处理函数。否则,返回 401 错误。

然后,我们通过调用 app.use() 方法来注册这个中间件函数,以便在每个请求中都进行身份验证。最后,我们定义一个名为 /protected 的路由处理函数,它表示受保护的资源。只有在身份验证通过后,才能访问这个路由处理函数。

通过这个简单的示例,我们可以看到如何使用 Express middleware 实现基本的身份验证功能。中间件函数充当责任链中的一个环节,通过对请求进行处理和过滤,为应用程序提供更好的安全性和用户体验。

75.[vue]: 手写 vue 双向绑定?【web框架】

双向绑定核心知识点

如果一个对象中有属性有方法,那么调用属性可以直接. 就可以调用,但是如果是调用方法的时候,是通过入参来决定key的值来调用的话,请用[]来表示:



  
    
      MVVM 双项绑定
      
  
  
    
      

Hi,MVVM

{{name}} 's age is {{age}}

高级开发者相关问题【共计 3 道题】

69.前端如何实现即时通讯?【JavaScript】

前端如何实现即时通讯

短轮询

短轮询的原理很简单,每隔一段时间客户端就发出一个请求,去获取服务器最新的数据,一定程度上模拟实现了即时通讯。

comet

comet有两种主要实现手段, 一种是基于 AJAX 的长轮询(long-polling)方式, 另一种是基于 Iframe 及 htmlfile 的流(streaming)方式,通常被叫做长连接。

具体两种手段的操作方法请移步 Comet技术详解:基于HTTP长连接的Web端实时通信技术

SSE

SSE(Server-Sent Event,服务端推送事件)是一种允许服务端向客户端推送新数据的HTML5技术。

Websocket

Websocket是一个全新的、独立的协议,基于TCP协议,与http协议兼容、却不会融入http协议,仅仅作为html5的一部分,其作用就是在服务器和客户端之间建立实时的双向通信。

Web Worker

Web Worker 的作用,就是为 JavaScript 创造多线程环境,允许主线程创建 Worker 线程,将一些任务分配给后者运行

Service workers

Service workers 本质上充当Web应用程序与浏览器之间的代理服务器,也可以在网络可用时作为浏览器和网络间的代理,创建有效的离线体验。

70.前端做错误监控?【JavaScript】

错误监控

错误分类:即时运行错误(代码错误)、资源加载错误

错误的捕获方式:

即时运行错误: try...catch window.onerror

资源加载错误:
1)、object.onerror
2)、performance.getEntries()
3)、Error事件捕获
performance.getEntries()这个是可以获取到所有的家已经加载的资源

Error事件捕获使用方式:

window.addEventListener('error',function(e){
    console.log('捕获',e)
},true)

跨域是可以捕获的:
1)、在script标签添加crossorigin属性
2)、在js响应头添加Access-Control-Allow-Origin:*;

上报错误:ajax通信方式上报、通过Image对象上报,非常简单
(new Image()).src='http://baidu.com/test/sdflijsd?=sdlfkj';

72.TCP 和 UDP的区别?【网络】

TCP和UDP的区别

TCP、UDP和HTTP关系

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

在网络层有IP协议、ICMP协议、ARP协议、RARP协议和BOOTP协议。
在传输层中有TCP协议与UDP协议。
在应用层有FTP、HTTP、TELNET、SMTP、DNS等协议。
因此,HTTP本身就是一个协议,是从Web服务器传输超文本到本地浏览器的传送协议。

TCP 是基于 TCP 协议实现的网络文本协议,属于传输层。
UDP 是和TCP 对等的,属于传输层,UDP 和 TCP 有重要的区别。

2、HTTP协议是建立在请求/响应模型上的。

首先由客户建立一条与服务器的TCP链接,并发送一个请求到服务器,请求中包含请求方法、URI、协议版本以及相关的MIME样式的消息。 服务器响应一个状态行,包含消息的协议版本、一个成功和失败码以及相关的MIME式样的消息。
HTTP/1.0为每一次HTTP的请求/响应建立一条新的TCP链接,因此一个包含HTML内容和图片的页面将需要建立多次的短期的TCP链接。一次TCP链接的建立将需要3次握手。
另外,为了获得适当的传输速度,则需要TCP花费额外的回路链接时间(RTT)。 每一次链接的建立需要这种经常性的开销,而其并不带有实际有用的数据,只是保证链接的可靠性, 因此HTTP/1.1提出了可持续链接的实现方法。HTTP/1.1将只建立一次TCP的链接而重复地使用它传输一系列的请求/响应消息,因此减少了链接建立的次数和经常性的链接开销。

三次握手的过程:
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;ACK:确认字符(Acknowledgement)
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

3、结论:虽然HTTP本身是一个协议,但其最终还是基于TCP的。

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

HTTPS:(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。 即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。

优点:协议较成熟,应用广泛、基于TCP/IP,拥有TCP优点、研发成本很低,开发快速、开源软件较多,nginx,apache,tomact等 缺点:无状态、无连接、只有PULL模式,不支持PUSH、数据报文较大 特性:基于TCP/IP应用层协议、无状态,无连接、支持C/S模式、适用于文本传输

TCP

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

TCP:(Transmission Control Protocol,传输控制协议)是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接。 一个TCP连接必须要经过三次“对话”才能建立起来,其中的过程非常复杂。 建立一个连接需要三次握手,而终止一个连接要经过四次握手,这是由TCP的半关闭(half-close)造成的。

优点:可靠性 、全双工协议、开源支持多、应用较广泛、面向连接、研发成本低、报文内容不限制(IP层自动分包,重传,不大于1452bytes)
缺点:操作系统:较耗内存,支持连接数有限、设计:协议较复杂,自定义应用层协议、网络:网络差情况下延迟较高、传输:效率低于UDP协议特性: 面向连接、可靠性、全双工协议、基于IP层、OSI参考模型位于传输层、适用于二进制传输

三次握手 与 四次挥手 当客户端和服务器通过三次握手建立了TCP连接以后,当数据传送完毕,肯定是要断开TCP连接的啊。那对于TCP的断开连接,这里就有了神秘的“四次挥手”。
1.第一次挥手:主机1(可以使客户端,也可以是服务器端),设置Sequence Number和Acknowledgment Number,向主机2发送一个FIN报文段;此时,主机1进入FIN_WAIT_1状态;这表示主机1没有数据要发送给主机2了;
2.第二次挥手:主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,Acknowledgment Number为Sequence Number加1;主机1进入FIN_WAIT_2状态;主机2告诉主机1,我也没有数据要发送了,可以进行关闭连接了;
3.第三次挥手:主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入CLOSE_WAIT状态;
4.第四次挥手:主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段以后,就关闭连接;此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机1也可以关闭连接了。
至此,TCP的四次挥手就这么愉快的完成了。

UDP

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

UDP:UDP是一个无连接协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据, 并尽可能快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制; 在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。
优点:操作系统:并发高,内存消耗较低、传输:效率高,网络延迟低、传输模型简单,研发成本低
缺点:协议不可靠、单向协议、开源支持少、报文内容有限,不能大于1464bytes、设计:协议设计较复杂、网络:网络差,而且丢数据报文
特性:无连接,不可靠,基于IP协议层,OSI参考模型位于传输层,最大努力交付,适用于二进制传输

对比

场景

TCP

UDP

是否连接

面向连接

面向非连接

传输可靠性

可靠

不可靠

应用场合

传输大量数据

少量数据

速度

展开阅读全文

页面更新:2024-03-07

标签:报文   应用程序   函数   中间件   错误   协议   主机   服务器   数据   网络

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top