当前位置: 首页 > 后端技术 > Node.js

译文:Top30最常用的Nodejs面试题の11-20

时间:2023-04-03 12:03:55 Node.js

作者?DhanjivPandey?本文来源?授权中文翻译?作者twitter?译者主页这个问题在今天仍然没有过时。#Q-11:回调地狱是什么?首先,你可以在理解回调之后给它点个赞。回调地狱是大量嵌套的回调,导致代码难以阅读和维护。让我们看下面的代码示例:elseconsole.log('Downloadfinished',photo)}console.log('Downloadstarted')在这种情况下,Node.js首先声明了displayPhoto函数。之后,它将调用downloadPhoto函数并将displayPhoto函数作为其回调传递。最后,代码在控制台上显示Downloadstarted。displayPhoto只会在downloadPhoto完成其所有任务后执行。#Q-12:如何避免Node.js中的回调地狱?Node.js在内部使用单线程事件循环来处理排队的事件。但是,如果任务的运行时间比预期的要长,这种方法可能会导致整个过程阻塞。Node.js通过合并回调(也称为高阶函数)解决了这个问题。因此,只要长时间运行的进程完成执行,就会触发关联的回调。通过这种方式,它允许代码在长时间运行的任务之后继续执行。然而,上述解决方案看起来很有前途。但有时,这会导致代码复杂且不可读。更多情况下会导致返回的回调链变长。由于这种前所未有的复杂性,调试代码可能很困难,而且可能很耗时。回调地狱问题有四种解决方案。1.程序模块化。它建议将逻辑划分为更小的模块。然后将它们从主模块连接在一起以达到预期的效果。2.使用异步机制。它是一个广泛使用的Node.js模块,提供连续的执行流。异步模块具有async.waterfallAPI,它使用下一个回调将数据从一个操作传递到另一个操作。另一个异步APIasync.map允许并行遍历一个项目列表并使用另一个结果列表进行回调。使用异步方法,调用者的回调仅被调用一次。这里的调用者是使用异步模块的主要方法。3.使用承诺机制。Promise提供了另一种编写异步代码的方法。它们要么返回执行结果,要么返回错误/异常。要实现承诺,您需要使用then()函数,它等待承诺对象返回。它有两个可选参数,是两个函数。根据承诺的状态,只会调用一个。如果承诺得到满足,将执行第一个函数调用。但是,如果Promise被拒绝,第二个函数将被调用。4.使用发电机。生成器是轻量级例程,通过yield关键字使函数等待和恢复。生成器函数使用特殊语法function*()。他们还可以使用promises或thunk等结构来挂起和恢复异步操作,并将同步代码转换为异步代码。#Q-13:你会用Nodejs搭建HTTP服务器吗,请说明你使用的代码?是的,我们可以在Node.js中创建HTTPServer。我们可以使用http-server命令来做到这一点。以下是示例代码:varhttp=require('http');varrequestListener=function(request,response){response.writeHead(200,{'Content-Type':'text/plain'});response.end('欢迎观众\n');}varserver=http.createServer(requestListener);server.listen(8080);//你想要开始的端口。#Q-14:Nodejs、AJAX和jQuery之间有什么区别?Node.js、AJAX和jQuery的一个共同特点是它们都是JavaScript的高级实现。但是,它们的用途完全不同。Node.js–它是用于开发客户端-服务器应用程序的服务器端平台。例如,如果我们必须构建一个在线员工管理系统,我们就不会使用客户端JS来实现它。但是Node.js肯定可以做到这一点,因为它运行在类似Apache的服务器上,而不是浏览器上。AJAX(又名异步Javascript和XML)——这是一种客户端脚本技术,主要用于在不刷新页面的情况下呈现页面内容。jQuery–这是一个众所周知的JavaScript模块,可以补充AJAX、DOM遍历、循环等。这个库提供了许多有用的函数来帮助JavaScript开发。但是,使用它不是强制性的,它还管理跨浏览器兼容性,因此它可以帮助您生成高度可维护的Web应用程序。#Q-15:Node.js中的全局变量是什么?Node.js中有三个关键字组成了Globals。它们是Global、Process和Buffer。GlobalGlobal关键字表示全局名称空间对象。它充当所有其他全局对象的容器。如果我们输入console.log(global)它将全部打印出来。关于全局对象需要注意的一件重要事情是,并非所有对象都在全局范围内,其中一些对象在模块范围内。因此,明智的做法是不要使用var关键字声明它们或将它们添加到Global对象中。使用var关键字声明的变量成为模块中的局部变量,而未声明的则订阅全局对象。Process也是全局对象之一,但包含将同步函数转换为异步回调的附加函数。从代码中的任何地方访问它都没有限制。它是EventEmitter类的一个实例。每个节点应用程序对象都是Process对象的一个??实例。它主要返回有关应用程序或环境的信息。-获取Node应用程序的执行路径。-获取当前运行的Node版本。-获取服务器平台。其他一些有用的处理方法如下:-知道节点程序使用的内存。-附加一个将在下一个周期调用的回调函数。会导致函数的执行延迟。BufferBuffer是Node.js中处理二进制数据的一个类。它类似于整数列表,但存储在V8堆之外的原始内存中。我们可以将JavaScript字符串对象转换为缓冲区。但这需要显式声明编码类型。——指定7位ASCII数据。–表示多字节编码的Unicode字符集。–代表2或4个字节,以小端编码。-用于Base64字符串编码。-将每个字节编码为两个十六进制字符。这是使用Buffer类的语法:>varbuffer=newBuffer(string,[encoding]);上面的命令将分配一个新的缓冲区来保存默认编码为utf8的字符串。但是,如果要将字符串写入现有的缓冲区对象,请使用以下代码行:数据写入缓冲区。#Q-16:如何在Node.js中加载HTML?要在Node.js中加载HTML,我们必须将HTML代码中的Content-type从text/plain更改为text/html。让我们看一个在Web服务器中创建静态文件的示例:fs.readFile(filename,"binary",function(err,file){if(err){response.writeHead(500,{"Content-Type":"text/plain"});response.write(err+"\n");response.end();return;}response.writeHead(200);response.write(file,"binary");response.end();});现在,我们将修改此代码以加载HTML页面而不是纯文本。fs.readFile(filename,"binary",function(err,file){if(err){response.writeHead(500,{"Content-Type":"text/html"});response.write(err+"\n");response.end();return;}response.writeHead(200,{"Content-Type":"text/html"});response.write(file);response.end();});#Q-17:Node.js中的EventEmitter是什么?Node.js中的事件模块允许我们创建和处理自定义事件。事件模块包含EventEmitter类,可用于引发和处理自定义事件。可以通过以下代码访问://导入事件模块varevents=require('events');//创建一个eventEmitter对象vareventEmitter=newevents.EventEmitter();当EventEmitter实例遇到错误时,它会触发错误事件。添加新侦听器时会触发newListener事件,移除侦听器时会触发removeListener事件。EventEmitter提供了几个属性,例如on和emit。on属性用于将函数绑定到事件,emit用于触发事件。#Q-18:Node.js有多少种流?Node.js中的Stream是一个对象,它允许以连续的方式从源读取数据或将数据写入特定目的地。在Node.js中,有四种类型的流:–这是一个用于读取操作的Stream。–这简化了写入操作。–此流可用于读取和写入Input操作。–它是一种基于可用输入执行计算的双工流形式。上面讨论的所有流都是EventEmitter类的实例。流抛出的事件随时间变化。一些常用的事件如下:–当有数据可供读取时将触发此事件。–Stream将在没有更多数据可读时触发此事件。–当读取或写入数据有任何错误时。–当所有数据都已刷新到底层系统时,将触发此事件。#Q-19:列出并解释重要的REPL命令?以下是一些最常用的REPL命令:<.help>–显示所有命令的帮助。–它显示所有可用命令的列表。–其目的是确定先前在REPL中执行的命令。<.savefilename>-将当前REPL会话保存到文件中。<.loadfilename>-在当前REPL会话中加载指定文件。-用于终止当前命令。–退出REPL。–此命令执行退出REPL。<.break>–从多行表达式导出。<.clear>–退出多行表达式。#Q-20:Node.js中的NPM是什么?NPM是Node和平台的包管理器。它有以下两个主要功能:它作为node.js包/模块的在线存储库,位于(译者:它不应该是npmjs.com吗?)。它作为一个命令行工具来安装包,执行Node.js包的版本控制和依赖管理。NPM与Node.js捆绑并安装。我们可以使用以下命令:#验证其版本$npm--version#使用以下命令来帮助安装任何Node.js模块。#$npminstall#例如下面是安装一个著名的Node.jsweb框架模块express的命令-$npminstallexpress#Tobecontinued...