15个常见的Node.js⾯试问题及答案
俗话说:临阵磨,不快也光。对于成功的编程⾯试来说,准备和知识⾯⼀样重要。准备使你有信⼼参加⾯试,⽽不⽤担⼼莫名的紧张情绪。如果第⼀次参加编程⾯试,这⼀点尤其重要。
为帮助 Node.js 开发⼈员更好的⾯试,列出了 15 个常见的 Node.js 和⽹络开发相关的⾯试问题。
在本⽂中,我们将重点讨论 Node.js 相关问题。但是,请记住 JavaScript 问题在 Node.js ⾯试中也经常问到,所以准备⼀些对你来说没什么坏处。javascript的特性
现在,让我们深⼊了解⾯试中可能会问到的 Node.js 问题。
1、Node.js与JavaScript有什么不同?
2、什么时候⽤Node.js?
Node.js 是异步的、事件驱动的、⾮阻塞的和单线程的,使得它成为开发下⾯应⽤程序的完美候选:
实时应⽤程序,如聊天和提供实时更新的应⽤程序。
将视频或其他多媒体内容流式传输给⼤量观众的流式应⽤程序。
其他 I/O 密集型应⽤程序,如协作平台。
遵循微服务架构的⽹络后端。
然⽽,Node.js 的特性使得它对于其他类型的应⽤程序来说不是⼀个理想的选择。执⾏ CPU 密集型任务的应⽤程序(如复杂的数学计算)在使⽤ CPU 时表现不佳,因为 Node.js 是单线程的。
3、EventEmitter做了什么?
Node.js 中任何对象发出的事件都是 EventEmitter 类的实例,就像 http 模块。
所有 EventEmitter 类都可以使⽤ () 函数将事件侦听器附加到事件。然后⼀旦捕捉到这样的事件,就会同步地逐个调⽤它的侦听器。
const events =require("events");
const eventEmitter =new events.EventEmitter();
const eventListener=function(){
console.log("event triggered");
}
<("emitted", eventListener);
4、事件循环是什么?
单线程的 Node.js 必须是⾮阻塞的,以防⽌线程阻塞在需要很长时间才能完成的任务上,事件循环负责实现这种⾮阻塞⾏为,它使⽤应⽤程序线程调度挂起的任务。
Node.js 在任务完成时通过回调来处理异步函数返回的响应。与创建任务的事件类似,任务完成后也会发出⼀个事件。Node.js 将需要处理的事件添加到事件队列。
事件循环对事件队列中的事件进⾏迭代,并安排何时执⾏其关联的回调函数。
5、流是什么?
Stream 流是从源读取或写⼊数据并将其传输到连续流⽬标的管道。有四种类型:
可读
可写的
可读写
先写⼊,再读出来
每个流也是⼀个 EventEmitter。这意味着流对象可以在流上没有数据、流上有可⽤数据或流中的数据在程序刷新时发出事件。
const fs =require("fs");
const readableStream = fs.createReadStream("");
let content ="";
<("data",(chunk)=>{
content += chunk;
});
<("end",()=>{
console.log(content);
});
6、ReadFile和createReadStream函数有什么区别?
readFile 函数异步读取⽂件的全部内容,并存储在内存中,然后再传递给⽤户。
createReadStream 使⽤⼀个可读的流,逐块读取⽂件,⽽不是全部存储在内存中。
与 readFile 相⽐,createReadStream 使⽤更少的内存和更快的速度来优化⽂件读取操作。如果⽂件相当⼤,⽤户不必等待很长时间直到读取整个内容,因为读取时会先向⽤户发送⼩块内容。
const fs =require("fs");
console.log(content);
});
7、如何处理Node.js中未捕获的异常?
我们可以在进程级别捕获应⽤程序中未捕获的异常。为此将侦听器附加到 process 全局对象:
<("uncaughtException",(err)=>{
console.log("exception caught: ", err);
});
8、Node.Js能否充分利⽤多核处理器?
(默认的)Node.js 应⽤程序总是单线程的,即使在多核处理器上运⾏,应⽤程序也能只使⽤⼀个处理器。
但是 Node.js 的核⼼模块之⼀ Cluster ⽀持 Node.js 应⽤程序开启多核,允许我们创建多个⼯作进程,这些进程可以在多个内核上并⾏运⾏,并共享⼀个端⼝来侦听事件。
每个进程使⽤ IPC 与主线程通信,并根据需要将服务器句柄传递给其他进程。主进程可以侦听端⼝本⾝并以循环⽅式将每个新连接传递给⼦进程,也可以将端⼝分配给⼦进程以便⼦进程侦听请求。
9、反应堆设计模式是什么?
反应堆设计模式是,Node.js 将回调函数(处理程序)附加到每个 I/O 操作,然后创建请求时将处理程序提交给解复⽤器。
解复⽤器收集应⽤程序中发出的每个 I/O 请求,并将它们作为队列中的事件进⾏排队。这个队列就是我们所说的事件队列。将事件排队后,解复⽤器返回应⽤程序线程的控制。
同时,事件循环遍历事件队列中的每个事件,并调⽤附加的回调来处理事件响应。
这就是 Node.js 中所使⽤的反应堆模式。
10、单线程与多线程⽹络后端相⽐有哪些好处?
尽管 Node.js 是单线程的,但是⼤多数⽤于后端开发的编程语⾔都提供多线程来处理应⽤程序操作。
为什么单线程有利于后端开发?
开发⼈员更容易实现应⽤程序。我们的应⽤程序在⽣产过程中不会突然遇到意外的竞争条件。
单线程应⽤程序易于扩展。
它们可以毫不延迟地在⼀个时刻收到的⼤量⽤户请求提供服务。相⽐之下,当流量较⼤时,多线程后端必须等待线程池中的线程释放,才能为⽤户请求提供服务。利⽤ Node.js 的⾮阻塞特性,⽤户请求不会在单个线程上挂起太长时间(只有在操作不是 CPU 密集型时)。
11、REPL是什么?
REPL 代表 Read Eval Print Loop,是⼀个虚拟环境,可以在其中轻松地运⾏编程语⾔。Node.js 带有⼀个内置的 REPL 来运⾏JavaScript 代码,类似于我们在浏览器中⽤来运⾏ JavaScript 代码的控制台。
要启动 Node.js REPL,只需在命令⾏上运⾏ node,然后写⼀⾏ JavaScript 代码,就可以在下⼀⾏看到它的输出。
12、Tick和setImmediate有什么区别?
传递给 setImmediate 函数的回调将在事件队列上的下⼀次迭代中执⾏。
另⼀⽅⾯,回调传递给 Tick 在下⼀次迭代之前以及程序中当前运⾏的操作完成之后执⾏。在应⽤程序启动时,开始遍历事件队列之前调⽤它的回调。
因此,回调 Tick 总是在 setImmediate 之前调⽤。
下⾯代码段:
setImmediate(()=>{
console.log("first");
})
console.log("second");
})
console.log("third");
将按顺序输出:
third
second
first
13、stub什么
测试应⽤程序时使⽤ stub,模拟给定组件或模块的⾏为,你可以将精⼒集中在要测试的代码部分。通过使⽤ stub 代替与测试⽆关的组件,不必担⼼外部组件会影响结果。
例如,如果正在测试的组件在预期测试的部分之前有⼀个⽂件读取操作,则可以使⽤ stub 来模拟该⾏为并返回模拟内容,⽽不⽤实际读取⽂件。
要实现这种分离,应该在单独的⽂件中声明 API 和 server,对应 app.js 和 server.js:
// app.js
const express =require("express");
const app =express();
app.use("/", index);
app.use("/contact", contact);
app.use("/user", user);
// server.js
const http =require("http");
const app =require("/app");
app.set('port', v.PORT);
const http = ateServer(app);
总结
在本⽂中,讨论了 15 个最常见的 Node.js ⾯试问题,帮助你为下⼀次⾯试做准备。知道你可能被问到的问题和答案,⾯试就不再紧张了。
End -
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论