15个常见的Node.js面试问题和答案准备工作与成功的编码面试知识一样重要。准备让您有信心去参加面试,而不必担心感到紧张。如果您是第一次参加编程面试,这一点尤为重要。为了帮助Node.js开发者更好地面试,我列出了15个常见的Node.js和Web开发相关的面试问题。在本文中,我们将重点关注Node.js相关问题。但是,请记住,JavaScript问题在Node.js面试中也经常被问到,所以准备一些对你没有坏处。不久前,我们写了一篇关于常见JavaScript面试问题的文章,涵盖了所有这些基础。https://livecodestream.dev/post/20-common-javascript-interview-questions/现在,让我们深入探讨面试中可能会问到的Node.js问题。1.Node.js与JavaScript有何不同?2.什么时候用Node.js?Node.js是异步的、事件驱动的、非阻塞的和单线程的,这使得它非常适合开发以下应用程序:实时应用程序,例如提供实时更新的聊天和应用程序流式传输的流式应用程序面向大量观众的视频或其他多媒体内容其他I/O密集型应用程序,例如协作平台遵循微服务架构的Web后端但是,Node.js的性质使其不太适合其他类型的应用程序。执行CPU密集型任务(例如复杂的数学计算)的应用程序在使用CPU时性能不佳,因为Node.js是单线程的。如果您想了解更多相关信息,请查看我们的文章Node.js架构以及何时在您的项目中使用它。3、EventEmitter是做什么的?Node.js中任何对象发出的事件都是EventEmitter类的实例,就像http模块一样。所有EventEmitter类都可以使用eventEmitter.on()函数将事件侦听器附加到事件。然后一旦捕获到这样的事件,它的监听器就会被一个一个同步调用。constevents=require("events");consteventEmitter=newevents.EventEmitter();consteventListener=function(){console.log("eventtriggered");}eventEmitter.on("emitted",eventListener);eventEmitter.emit("发射");4.什么是事件循环?单线程Node.js必须是非阻塞的,以防止线程阻塞需要很长时间才能完成的任务。事件循环负责这种非阻塞行为。它使用应用程序的线程调度挂起的任务。当任务完成时,Node.js通过回调处理异步函数返回的响应。与创建任务的事件类似,任务完成时也会发出一个事件。Node.js将需要处理的事件添加到事件队列中。事件循环遍历事件队列中的事件,并在执行相关回调函数时进行调度。5.什么是流?Stream是从源读取或写入数据并将其传输到连续流目标的管道。有四种类型:ReadableWritableRead-write先写后读每个流也是一个EventEmitter。这意味着流对象可以在流上没有数据、流上有数据或流中的数据以编程方式刷新时发出事件。constfs=require("fs");constreadableStream=fs.createReadStream("test.txt");letcontent="";readableStream.on("data",(chunk)=>{content+=chunk;});readableStream。on("end",()=>{console.log(content);});6.readFile和createReadStream函数有什么区别?readFile函数异步读取文件的全部内容,将其存储在内存中,然后交付给用户。createReadStream采用可读流并逐块读取文件,而不是将其全部存储在内存中。createReadStream使用更少的内存优化文件读取操作,并且比readFile更快。如果文件很大,用户不必等待很长时间才能读取全部内容,因为先将小块发送给用户。constfs=require("fs");fs.readFile("test.txt",(err,content)=>{console.log(content);});7.如何处理Node.js中未捕获的异常?我们可以在进程级别捕获应用程序中未捕获的异常。为此,将侦听器附加到进程全局对象:process.on("uncaughtException",(err)=>{console.log("exceptioncaught:",err);});8.Node.js能否充分利用多核处理器?(默认)Node.js应用程序始终是单线程的,即使在多核处理器上运行时,应用程序也只能使用一个处理器。但是Cluster是Node.js的核心模块之一,它支持Node.js应用的多核,让我们可以创建多个可以在多核上并行运行的worker进程,共享一个端口来监听事件。每个进程使用IPC与主线程通信,并根据需要将服务器句柄传递给其他进程。主进程可以自己监听端口,并以循环方式将每个新连接传递给子进程,或者您可以将端口分配给子进程,以便子进程监听请求。9.什么是Reactor设计模式?Reactor设计模式是Node.js为每个I/O操作附加一个回调函数(handler),然后在创建请求时将handler提交给demuxer。多路分解器收集应用程序中发出的每个I/O请求,并将它们作为事件排入队列。这个队列就是我们所说的事件队列。对事件进行排队后,多路分解器将控制权返回给应用程序线程。同时,事件循环遍历事件队列中的每个事件并调用额外的回调来处理事件响应。这是Node.js中使用的Reactor模式。10.单线程和多线程网络后端有什么好处?尽管Node.js是单线程的,但大多数用于后端开发的编程语言都提供多线程来处理应用程序操作。为什么单线程适合后端开发?开发人员更容易实现应用程序。我们的应用程序不会在生产过程中突然遇到意外的竞争条件。单线程应用程序可以轻松扩展。他们可以毫不延迟地处理一次收到的大量用户请求。相反,当流量很高时,多线程后端必须等待线程池中的线程被释放才能为用户请求提供服务。利用Node.js的非阻塞特性,用户请求不会在单个线程上挂起太久(仅当操作不是CPU密集型时)。11.什么是REPL?REPL代表ReadEvalPrintLoop,是一个可以轻松运行编程语言的虚拟环境。Node.js带有一个内置的REPL来运行JavaScript代码,类似于我们用来在浏览器中运行JavaScript代码的控制台。要启动Node.jsREPL,只需在命令行上运行node,编写一行JavaScript代码,然后在下一行查看其输出。12.process.nextTick和setImmediate有什么区别?传递给setImmediate函数的回调将在事件队列的下一次迭代中执行。另一方面,传递给process.nextTick的回调在下一次迭代之前和程序中当前运行的操作完成之后执行。它的回调在应用程序启动时调用,然后开始遍历事件队列。因此,回调process.nextTick总是在setImmediate之前被调用。以下代码片段:setImmediate(()=>{console.log("first");})process.nextTick(()=>{console.log("second");})console.log("third");将按顺序输出:thirdsecondfirst13。什么是存根?在测试应用程序时使用存根,模拟给定组件或模块的行为,您可以专注于要测试的代码部分。通过使用存根而不是与测试无关的组件,您不必担心外部组件会影响结果。例如,如果被测试的组件在预期被测试的部分之前有文件读取操作,则可以使用存根来模拟该行为并返回模拟内容而不实际读取文件。在Node.js中,我们使用Sinon这样的库来实现(译者注,Sinon替换了测试中的某部分代码,以降低编写测试项的复杂度https://sinonjs.org)。14.为什么在express中将“应用程序”和“服务器”分开是个好习惯?通过在express中分离应用程序和服务器,您可以将API实现与网络相关配置分开。在不执行网络调用的情况下执行API测试可确保更快的测试执行和更好的代码覆盖率指标。为了实现这种分离,API和服务器应该在单独的文件中声明,对应于app.js和server.js://app.jsconstexpress=require("express");constapp=express();app.use("/",index);app.use("/contact",contact);app.use("/user",user);module.exports=app;//server.jsconsthttp=require("http");constapp=require("/app");app.set('port',process.env.PORT);consthttphttp=http.createServer(app);15.什么是纱线和npm?为什么使用yarn而不是npm?npm是Node.js默认自带的包管理器。它有一个很大的公共库和私有库存储在npmregistry数据库中(译者注,官方默认中央库http://registry.npmjs.org/,国内淘宝镜像http://registry.npm.taobao.org/),用户可以通过npm命令行访问数据库。借助npm,用户可以轻松管理项目中的依赖项。yarn也是一个包管理器,为了解决npm的一些缺点。yarn依赖于npm注册表来为用户提供对包的访问。yarn的底层结构基于npm。如果你从npm迁移到yarn,项目结构和工作流程不需要做很大的改变。如前所述,yarn在某些情况下提供了比npm更好的功能。与npm不同,它缓存它下载的每个包,因此您不必重新下载它。通过检查和验证包的完整性提供更好的安全性,保证在一个系统上运行的包在任何其他系统上运行完全相同,这就是为什么选择yarn而不是npm进行包管理。结论在本文中,讨论了15个最常见的Node.js面试问题,以帮助您为下一次面试做准备。了解您可能会被问到的问题和答案可以减轻面试压力。祝你好运,面试成功!
