# Node 高级面试题和答案解析
# 1、什么是线程池,Node.js 中哪个库处理它 ?
答案解析
线程池由 libuv 库处理。
- libuv 是一个多平台的 C 库,它支持基于异步 I/O 的操作,例如文件系统、网络和并发。
# 2、如何通过集群提高 Node.js 的性能 ?
答案解析
Node.js 应用程序在单个处理器上运行,这意味着默认情况下它们不会利用多核系统。
- 集群模式用于启动多个 node.js 进程,从而拥有多个事件循环实例。
- 当我们开始在后台的 nodejs 应用程序中使用集群时,会创建多个 node.js 进程,但还有一个称为集群管理器的父进程,它负责监控我们应用程序各个实例的健康状况。
# 3、工作线程与集群有何不同 ?
集群(Cluster):
- 每个 CPU 上都有一个进程与 IPC 进行通信。
- 如果我们想让多个服务器通过单个端口接受 HTTP 请求,集群会很有帮助。
- 这些进程在每个 CPU 中产生,因此将具有单独的内存和节点实例,这将进一步导致内存问题。
工作线程:
- 总共只有一个进程有多个线程。
- 每个线程都有一个 Node 实例(一个事件循环,一个 JS 引擎),大多数 API 都可以访问。
- 与其他线程共享内存(例如 SharedArrayBuffer)
- 这可用于处理数据或访问文件系统等 CPU 密集型任务,因为 NodeJS 是单线程的,同步任务可以更有效地利用工作线程。
# 4、Node.js 中的事件发射器是什么 ?
答案解析
EventEmitter
是一个 Node.js 类,它包含所有基本上能够发出事件的对象。- 这可以通过使用
eventEmitter.on()
函数附加由对象发出的命名事件来完成。
因此,每当这个对象抛出一个甚至附加的函数时,都会同步调用。
const EventEmitter = require("events");
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
myEmitter.on("event", () => {
console.log("an event occurred!");
});
myEmitter.emit("event");
# 5、如何测量异步操作的持续时间 ?
Performance API
为我们提供了找出必要性能指标的工具一个简单的例子是使用
async_hooks
和perf_hooks
"use strict";
const async_hooks = require("async_hooks");
const { performance, PerformanceObserver } = require("perf_hooks");
const set = new Set();
const hook = async_hooks.createHook({
init(id, type) {
if (type === "Timeout") {
performance.mark(`Timeout-${id}-Init`);
set.add(id);
}
},
destroy(id) {
if (set.has(id)) {
set.delete(id);
performance.mark(`Timeout-${id}-Destroy`);
performance.measure(
`Timeout-${id}`,
`Timeout-${id}-Init`,
`Timeout-${id}-Destroy`
);
}
},
});
hook.enable();
const obs = new PerformanceObserver((list, observer) => {
console.log(list.getEntries()[0]);
performance.clearMarks();
observer.disconnect();
});
obs.observe({ entryTypes: ["measure"], buffered: true });
setTimeout(() => {}, 1000);
# 6、如何衡量异步操作的性能 ?
Performance API
为我们提供了找出必要性能指标的工具。如下:
const { PerformanceObserver, performance } = require("perf_hooks");
const obs = new PerformanceObserver((items) => {
console.log(items.getEntries()[0].duration);
performance.clearMarks();
});
obs.observe({ entryTypes: ["measure"] });
performance.measure("Start to Now");
performance.mark("A");
doSomeLongRunningProcess(() => {
performance.measure("A to Now", "A");
performance.mark("B");
performance.measure("A to B", "A", "B");
});
# 7、对于 Node.js,为什么 Google 使用 V8 引擎 ?
答案解析
那么,还有其他选择吗?是的,当然,我们有来自 Firefox 的Spidermonkey
,来自 Edge 的 Chakra
- 但
Google 的 v8 是发展最快的
(因为它是开源的,所以有一个巨大的社区帮助开发功能和修复错误)和最快的(因为它是用 c++ 编写的) - 作为一个 JavaScript 和 WebAssembly 引擎。它可以移植到几乎所有已知的机器上。
# 8、为什么要把 Express 应用和服务器分开 ?
答案解析
- 服务器负责初始化路由、中间件和其他应用程序逻辑,而应用程序具有所有业务逻辑,这些业务逻辑将由服务器启动的路由提供服务。
- 这确保了业务逻辑被封装并与应用程序逻辑解耦,从而使项目更具可读性和可维护性。
# 9、 解释 Node.js 中的 Reactor 模式是什么 ?
答案解析
Reactor 模式又是一种用于非阻塞 I/O 操作的模式,但总的来说,这用于任何事件驱动的架构。
这里面有两个组件:Reactor 和 Handler
- Reactor:它的工作是将 I/O 事件分派给适当的处理程序
- Handler:它的工作是实际处理这些事件
# 10、什么是中间件 ?
答案解析
中间件介于请求和业务逻辑之间。
- 它主要用于捕获日志并启用速率限制、路由、身份验证,基本上是任何不属于业务逻辑的部分。
- 当然,还有第三方中间件,例如 body-parser,您可以为特定用例编写自己的中间件。
# 11、什么是 node.js 缓冲区?
答案解析
通常,缓冲区是一个临时内存,流主要使用它来保存一些数据,直到被消耗为止。
- 与 JavaScript 的 Unit8Array 相比,缓冲区还引入了其他用例,主要用于表示固定长度的字节序列。
- 它还支持 ASCII、utf-8 等传统编码。它是 v8 之外的固定(不可调整大小)分配内存。
# 12、什么是 node.js 流 ?
答案解析
Streams 是 EventEmitter 的实例,可用于处理 Node.js 中的流数据。
- 它们可用于处理和操作网络上的流式大文件(视频、mp3 等)。他们使用缓冲区作为临时存储。
流主要有四种类型:
- Writable:可以写入数据的流(例如,fs.createWriteStream())
- Readable:可以从中读取数据的流(例如,fs.createReadStream())
- Duplex:既可读又可写的流(例如,net.Socket)
- Transform:可以在写入和读取数据时修改或转换数据的双工流(例如,zlib.createDeflate())
# 13、我们如何在 node.js 中使用 async await ?
以下是使用 async-await 模式的示例
function wait(timeout) {
return new Promise((resolve) => {
setTimeout(() => {
resolve();
}, timeout);
});
}
async function requestWithRetry(url) {
const MAX_RETRIES = 10;
for (let i = 0; i <= MAX_RETRIES; i++) {
try {
return await request(url);
} catch (err) {
const timeout = Math.pow(2, i);
console.log("Waiting", timeout, "ms");
await wait(timeout);
console.log("Retrying", err.message, i);
}
}
}
# 14、如何在 Node.js 中创建一个返回 Hello World 的简单服务器?
var http = require("http");
http
.createServer(function (request, response) {
response.writeHead(200, { "Content-Type": "text/plain" });
response.end("Hello World\n");
})
.listen(3000);
大厂最新技术学习分享群

微信扫一扫进群,获取资料
X