Node.js 面试题 及答案

16 Mar 2025 | 17 min read

以下是关于 Node.js 常问的Node.js 面试题及答案列表。


1) 什么是 Node.js?

Node.js 是一种用于构建可伸缩程序的服务器端脚本。它是一个基于 Google Chrome JavaScript 引擎构建的 Web 应用程序框架。它在 Mac OS、Windows 和 Linux 上的 Node.js 运行时中运行,无需任何更改。此运行时允许您在浏览器外的任何机器上执行 JavaScript 代码。


2) Node.js 可以免费使用吗?

是的。它是在 MIT 许可下发布的,并且可以免费使用。


3) Node 是单线程应用程序吗?

是的。Node 是一个具有事件循环的单线程应用程序。


4) Node.js 的目的是什么?

Node.js 的目的是如下:

  • 实时 Web 应用程序
  • 网络应用程序
  • 分布式系统
  • 通用应用程序

5) Node.js 有哪些优点?

以下是 Node.js 的主要优点:

  • Node.js 是异步和事件驱动的。Node.js 库的所有 API 都是非阻塞的,其服务器不会等待 API 返回数据。它在调用 API 后会继续执行下一个 API,而 Node.js 事件的通知机制会从之前的 API 调用响应服务器。
  • Node.js 非常快,因为它构建在 Google Chrome 的 V8 JavaScript 引擎之上。其库在代码执行方面非常快。
  • Node.js 是单线程但高度可伸缩的。
  • Node.js 提供无缓冲功能。其应用程序从不缓冲任何数据。它以块的形式输出数据。

6) 解释 Node.js Web 应用程序架构?

Web 应用程序分为 4 层

  • 客户端层:客户端层包含 Web 浏览器、移动浏览器或应用程序,它们可以向 Web 服务器发出 HTTP 请求。
  • 服务器层:服务器层包含 Web 服务器,它可以拦截客户端发出的请求并向其发送响应。
  • 业务层:业务层包含应用程序服务器,Web 服务器利用它进行所需的处理。该层通过数据库或某些外部程序与数据层交互。
  • 数据层:数据层包含数据库或任何数据源。
Node.js web layer

7) 你如何理解 I/O 这个术语?

I/O 术语表示输入和输出。它用于访问应用程序外部的任何内容。I/O 描述了将数据传输到介质或从介质传输到另一个介质的任何程序、操作或设备。此介质可以是物理设备、网络或系统内的文件。

应用程序启动后,I/O 会加载到机器内存中以运行程序。


8) Node.js 中有多少种 API 函数?

Node.js 中有两种 API 函数:

  • 异步、非阻塞函数
  • 同步、阻塞函数

9) 你如何理解 JavaScript 中的一等公民函数?

当函数像任何其他变量一样被处理时,这些函数被称为一等公民函数。除了 JavaScript,许多其他编程语言,如 Scala、Haskell 等,都遵循此模式。一等公民函数可以作为参数传递给另一个函数(回调),或者一个函数可以返回另一个函数(高阶函数)。一些广受欢迎的高阶函数示例包括 map() 和 filter()。


10) JavaScript 和 Node.js 有什么区别?

JavaScript 和 Node.js 之间的区别

下表列出了 JavaScript 和 Node.js 之间的关键区别:

比较特征JavaScriptNode.js
类型JavaScript 是一种编程语言。更确切地说,您可以说它是一种用于在网站上编写脚本的脚本语言。Node.js 是 JavaScript 的解释器和运行时环境。
用途JavaScript 用于 Web 应用程序的任何客户端活动。Node.js 用于访问或执行任何操作系统的任何非阻塞操作。
运行引擎JavaScript 的运行引擎是 Spider monkey(Firefox)、JavaScript Core(Safari)、V8(Google Chrome)等。Node.js 的运行引擎是 V8(Google Chrome)。
浏览器兼容性JavaScript 只能在浏览器中运行。Node.js 代码可以在浏览器外运行。
平台依赖性JavaScript 主要用于客户端,用于前端开发。Node.js 主要用于服务器端,用于后端开发。
HTML 兼容性JavaScript 能够添加 HTML 并操作 DOM。Node.js 不兼容 HTML 标签。
示例一些 JavaScript 框架的例子是 RamdaJS、TypedJS 等。一些 Node.js 模块的例子是 Lodash、express 等。我们必须从 npm 导入这些模块。
编写于JavaScript 是 ECMA 脚本的升级版本,它使用 Chrome 的 V8 引擎,并用 C++ 编写。Node.js 用 C、C++ 和 JavaScript 编写。

11) 解释 Node.js 的工作原理?

Node.js Web 服务器的工作流程通常如下图所示。让我们详细了解操作流程:

Node.js Interview Questions
  • 根据上图,客户端向 Web 服务器发送请求以与 Web 应用程序交互。这些请求可以是无阻塞的或阻塞的,并用于查询数据、删除数据或更新数据。
  • js 接收传入的请求并将其添加到事件队列中。
  • 在此步骤之后,请求逐个通过事件循环。它检查请求是否足够简单,不需要任何外部资源。
  • 事件循环然后处理简单请求(非阻塞操作),例如 I/O 轮询,并将响应返回给相应的客户端。
  • 线程池中的一个线程被分配给一个复杂的请求。该线程负责通过访问计算、数据库、文件系统等外部资源来完成特定的阻塞请求。
  • 任务完成后,响应被发送到事件循环,然后事件循环将该响应发送回客户端。

12) 如何管理 Node.js 项目中的包?

我们可以通过使用几个包安装程序及其相应的配置文件来管理 Node.js 项目中的包。大多数都使用 npm 或 yarn。npm 和 yarn 都提供了几乎所有的 JavaScript 库,并具有控制环境特定配置的扩展功能。我们可以使用 package.json 和 package-lock.json 来维护项目中安装的库的版本。因此,将该应用程序移植到不同环境没有问题。


13) 为什么 Node.js 是单线程的?

Node.js 是一个单线程应用程序,具有用于异步处理的事件循环。在典型的 Web 负载下,在单线程上执行异步处理的最大优势在于,与典型的基于线程的实现相比,您可以获得更高的性能和可伸缩性。


14) 你如何理解 Node.js 中的回调地狱?

当 JavaScript 开发人员尝试一个接一个地执行多个异步操作时,回调地狱会给他们带来很多问题。当某个外部活动必须在处理结果之前完成时,该函数被称为异步函数。它被称为异步是因为在结果可用之前存在不可预测的时间。这些函数需要一个回调函数来处理错误和处理结果。

示例


15) Node.js 比其他最流行的框架好在哪里?

根据以下标准,我们可以说 Node.js 比其他最流行的框架更好:

  • js 由于其非阻塞 I/O 和基于事件的模型,使得开发变得简单。这种简洁性带来了快速的响应时间和并发处理,不像其他框架那样开发者需要进行线程管理。
  • js 在用 C++ 编写的 Chrome V8 引擎上运行。它通过不断改进极大地提高了性能。
  • 使用 Node.js,我们可以在前端和后端开发中使用 JavaScript,这将更快。
  • js 提供了充足的库,因此我们无需重新发明轮子。

16) Node.js 最常用于哪些类型的应用程序?

Node.js 最常广泛用于以下应用程序:

  • 物联网
  • 实时协作工具
  • 实时聊天
  • 复杂的 SPA(单页应用程序)
  • 流式应用程序
  • 微服务架构等。

17) Node.js 有哪些常用的定时特性?

以下是一些常用的 Node.js 定时特性列表:

  • setTimeout/clearTimeout:Node.js 的此定时特性用于在代码执行中实现延迟。
  • setInterval/clearInterval:setInterval 或 clearInterval 定时特性用于在应用程序中多次运行代码块。
  • setImmediate/clearImmediate:Node.js 的此定时特性用于在事件循环周期结束时设置代码的执行。
  • nextTick:此定时特性将代码的执行设置为下一个事件循环周期的开始。

18) 你如何理解 Node.js 中的 fork 术语?

通常,fork 用于创建子进程。在 Node.js 中,它用于创建 V8 引擎的新实例,以运行多个工作进程来执行代码。


19) 我们可以使用什么工具来确保 Node.js 中的一致代码风格?

ESLint 工具是我们可以在任何 IDE 中使用的最佳工具之一,用于确保一致的编码风格。它还有助于维护代码库。


20) 前端开发和后端开发的主要区别是什么?

下表列出了前端开发和后端开发之间的关键区别:

前端开发后端开发
应用程序中的前端开发是指应用程序的客户端。应用程序中的后端开发是指应用程序的服务器端。
顾名思义,前端开发是用户可以查看和交互的 Web 应用程序的一部分。顾名思义,后端开发包括所有发生在幕后而用户无法查看和交互的内容。
前端开发包括所有与 Web 应用程序的视觉方面相关的内容。后端开发通常包括与数据库通信以响应用户请求的 Web 服务器。
HTML、CSS、Bootstrap、jQuery、JavaScript、AngularJS 和 React.js 是基本的前端开发技术。Java、PHP、Python、C++、Node.js 等是后端开发所需的技术。
一些前端框架的例子是 AngularJS、React.js、jQuery、Sass 等。一些后端框架的例子是 Express、Django、Rails、Laravel、Spring 等。

21) 给一个例子来说明如何在 Node.js 中使用 async await?

请看下面使用 async-await 模式的示例:


22) Node.js 中的模块是什么?Node.js 中使用了哪些不同的模块?

在 Node.js 应用程序中,模块就像 JavaScript 库,包含一组函数。要将模块包含到 Node.js 应用程序中,我们必须使用 require() 函数,并在括号中包含模块的名称。

Node.js 有几个模块,用于为 Web 应用程序提供基本功能。以下是一些模块的列表:

核心模块描述
HTTPHTTP 模块包含类、方法和事件,用于创建 Node.js HTTP 服务器。
utilutil 模块包含应用程序所需的实用函数,对开发人员非常有帮助。
urlurl 模块用于包含 URL 解析的方法。
fsfs 模块包含事件、类和方法来处理文件 I/O 操作。
stream 模块用于包含处理流式数据的方法。
query stringquery string 模块用于包含处理查询字符串的方法。
zlibzlib 模块用于包含压缩或解压缩应用程序中使用文件的文件的方法。

23) Node.js 中的缓冲区是什么?

通常,缓冲区是流用来暂存一些数据直到被消耗的临时内存。缓冲区用于表示 V8 JavaScript 引擎外部分配的固定大小的内存块。它不能被调整大小。它就像一个整数数组,每个整数代表一个字节的数据。它由 Node.js Buffer 类实现。缓冲区还支持 ASCII、utf-8 等旧版编码。


24) 什么是 error-first callback?

Error-first callbacks 用于传递错误和数据。如果发生错误,程序员必须检查第一个参数,因为它是始终是错误参数。额外的参数用于传递数据。


25) 什么是异步 API?

Node.js 库的所有 API 都是异步的,意味着非阻塞。Node.js 服务器不会等待 API 返回数据。Node.js 服务器在调用 API 后会继续执行下一个 API,而 Node.js 事件的通知机制会从之前的 API 调用响应服务器。


26) 如何避免回调?

要避免回调,可以使用以下任一选项:

  • 可以使用模块化。它将回调分解成独立的函数。
  • 可以使用Promises
  • 可以使用yield 配合 Generators 和 Promises。

27) Node.js 提供调试器吗?

是的,Node.js 提供了一个简单的基于 TCP 的协议和内置的调试客户端。要调试您的 JavaScript 文件,您可以在 js 文件名后面加上 debug 参数。

语法


28) 什么是控制流函数?

控制流函数是在多个异步函数调用之间运行的通用代码片段。


29) "控制流" 如何控制函数调用?

控制流执行以下工作:

  • 控制执行顺序
  • 收集数据
  • 限制并发
  • 调用程序中的下一步

30) 可以访问 Node 中的 DOM 吗?

不,无法访问 Node 中的 DOM。


31) 可以使用事件循环异步完成哪些类型的任务?

  • I/O 操作
  • 繁重计算
  • 任何需要阻塞的操作

32) Node.js 中的 REPL 是什么?

REPL 是 Read Eval Print Loop 的缩写。它指定了一个计算机环境,如窗口控制台或 Unix/Linux shell,您可以在其中输入命令,计算机将响应输出。它在编写和调试代码方面非常有用。REPL 环境包含 Node.js。

查看示例


Node.js Interview Questions

33) 解释 Node REPL 中使用的术语的任务。

以下是 REPL 中使用的术语及其定义任务:

Read:读取用户输入;将输入解析为 JavaScript 数据结构并存储在内存中。

Eval:获取并评估数据结构。

Print:用于打印结果。

Loop:循环执行上述命令,直到用户按两次 Ctrl+C 终止。


34) 可以使用 Node REPL 来评估简单表达式吗?

是的。您可以使用 Node REPL 来评估简单表达式。


35) 下划线变量在 REPL 中有什么用?

在 REPL 中,下划线变量用于获取最后一个结果。


36) Node.js 支持加密吗?

是的,Node.js Crypto 模块支持加密。它提供了加密功能,包括 Open SSL 的 hash、HMAC、cipher、decipher、sign 和 verify 函数的一组包装器。例如:


37) npm 是什么?npm 的主要功能是什么?

npm 是 Node Package Manager 的缩写。以下是 npm 的两个主要功能:

  • Node.js 包/模块的在线存储库,可在 search.nodejs.org 上搜索
  • 用于安装包、进行版本管理和 Node.js 包依赖管理的命令行实用程序。

38) 可以使用哪些工具来确保 Node.js 中的一致风格?

以下是可以用于团队开发代码、强制执行给定样式指南并通过静态分析捕获常见错误的工具列表:

  • JSLint
  • JSHint
  • ESLint
  • JSCS

39) 操作错误和程序员错误有什么区别?

操作错误不是 bug,而是系统出现的问题,如请求超时或硬件故障。另一方面,程序员错误是实际的 bug。


40) 全局安装依赖项和本地安装依赖项有什么区别?

  • 全局安装的依赖项存储在/npm 目录中。而本地安装的依赖项则以本地模式存储。这里的本地模式是指在 Node 应用程序所在的文件夹中位于 node_modules 目录中的包安装。
  • 全局部署的包不能直接通过 require() 在 Node 应用程序中导入。另一方面,可以通过 require() 访问本地部署的包。
  • 要全局安装 Node 项目,使用 -g 标志。
  • 要本地安装 Node 项目,语法是

41) Buffer 类在 Node.js 中有什么用?

Node.js 提供了 Buffer 类来存储原始数据,类似于整数数组,但对应于 V8 堆外部的原始内存分配。它是一个全局类,可以在不导入 buffer 模块的情况下在应用程序中访问。使用 Buffer 类是因为纯 JavaScript 与二进制数据不兼容。因此,在处理 TCP 流或文件系统时,处理字节流是必要的。


42) assert 在 Node.js 中的作用是什么?

Node.js Assert 是一种编写测试的方式。除非测试失败,否则它在运行时不提供任何反馈。assert 模块提供了一组简单的断言测试,可用于测试不变性。该模块旨在供 Node.js 内部使用,但可以通过 require('assert') 在应用程序代码中使用。例如:


43) Node.js 中的流是什么?

流是允许您从源读取数据并将数据写入目标的流对象。Node.js 中有四种类型的流:

  • Readable:此流用于读取操作。
  • Writable:此流用于写入操作。
  • Duplex:此流可用于读取和写入操作。
  • Transform:这是一种双工流,其输出根据输入进行计算。

44) Node.js 中的事件驱动编程是什么?

在 Node.js 中,事件驱动编程意味着 Node 一旦启动服务器,就会初始化其变量,声明函数,然后等待事件发生。这是 Node.js 比其他类似技术快得多的原因之一。

Node.js events 1

45) Node.js 中的事件和回调有什么区别?

虽然事件和回调看起来相似,但区别在于回调函数在异步函数返回其结果时被调用,而事件处理基于观察者模式。每当触发事件时,其侦听器函数就会开始执行。Node.js 具有通过 events 模块和 EventEmitter 类提供的多个内置事件,用于绑定事件和事件侦听器。


46) Node.js 中的 Punycode 是什么?

Punycode 是一种编码语法,用于将 Unicode (UTF-8) 字符字符串转换为 ASCII 字符串。它与 Node.js v0.6.2 及更高版本捆绑在一起。如果您想在其他 Node.js 版本中使用它,则先使用 npm 安装 Punycode 模块。您必须使用 require('Punycode') 来访问它。

语法


47) Node.js TTY 模块包含什么?

Node.js TTY 模块包含 tty.ReadStream 和 tty.WriteStream 类。在大多数情况下,无需直接使用此模块。您必须使用 require('tty') 来访问此模块。

语法


48) Angular 和 Node.js 之间的主要区别是什么?

Angular 和 Node.js 之间的主要区别

AngularNode.js
Angular 是一个用于开发动态 Web 应用程序的结构化前端开发框架。Node.js 是一个跨平台、运行时、服务器端环境,用于编写 JavaScript 语言的应用程序。
Angular 完全用 TypeScript 语言编写。Node.js 用 C、C++ 和 JavaScript 语言编写。
Angular 用于构建单页、客户端 Web 应用程序。Node.js 用于构建快速、可伸缩的客户端和服务器端网络应用程序。
Angular 易于使用。开发人员需要添加 Angular 文件才能在他们的应用程序中使用它。Node.js 使用起来有点复杂。在这里,开发人员需要在他们的计算机系统上安装 Node.js。
Angular 将 Web 应用程序分解为 MVC 组件。在这里,模型和视图比其他 JavaScript 客户端框架中的模型和视图要简单得多。Node.js 生成数据库查询,并利用 JavaScript 的事件驱动特性来支持非阻塞操作,从而提高平台效率。
Angular 基于模型-视图-控制器设计模式,并完全遵循该模式。Node.js 是单线程的。这意味着 Web 请求和处理在同一个线程上运行。
Angular 是一个 Web 框架。Node.js 提供了不同的 Web 框架,如 Socket.io、Hapi.js、Meteor.js、Express.js 和 Sails.js 等。
Angular 非常适合创建高度活跃和交互式的 Web 应用程序。Node.js 最适合开发小型项目。
Angular 需要对原型设计、作用域和各种其他 JavaScript 方面有深入的了解。Node.js 使开发人员能够同时在客户端和服务器端使用 JavaScript。因此,他们可以专注于学习一门语言。

49) 操作错误和程序员错误之间的主要区别是什么?

操作错误和程序员错误之间最关键的区别在于,操作错误不是 bug,而是系统问题,例如请求超时或硬件故障。另一方面,程序员错误是应用程序中的实际 bug。


50) 你如何理解 Node.js 中的 EventEmitter?

在 Node.js 中,EventEmitter 是一个类,它包含所有能够发出事件的对象。这可以通过附加命名事件来实现,这些事件由对象通过 eventEmitter.on() 函数发出。因此,每当此对象触发事件时,都会同步调用附加的函数。

示例


51) Node.js 中 readFile 和 createReadStream 有什么区别?

在 Node.js 中,有两种读取和执行文件的方法:readFile 和 CreateStream。

  • readFile() 过程是一个完全缓冲的过程,只有在整个文件被推入缓冲区并读取后才返回响应。此过程称为内存密集型过程,对于大文件,处理可能非常慢。
  • 另一方面,createReadStream() 是一个部分缓冲的过程,它将整个过程视为一系列事件。整个文件被分成块,然后逐个处理并作为响应发送回来。完成此步骤后,它们最终会从缓冲区中删除。与 readFile 过程不同,createReadStream 过程对于处理大文件非常有效。

52) Node.js 中 Punycode 的概念是什么?

在 Node.js 中,Punycode 的概念用于将一种字符串转换为另一种字符串。Punycode 是一种编码语法,用于将 Unicode (UTF-8) 字符字符串转换为基本的 ASCII 字符串。现在,主机名只能理解 ASCII 字符,因此,在 Node.js 版本 0.6.2 之后,它与默认的 Node 包捆绑在一起。

要在之前的任何版本中使用它,您需要使用以下代码:

语法


53) 如何通过集群增强 Node.js 性能?

仅仅因为 Node.js 应用程序运行在单个处理器上,它们默认就不会利用多核系统。集群用于克服这个问题。集群模式用于启动多个 node.js 进程,从而拥有多个事件循环实例。当我们开始在 Node.js 应用程序中使用集群时,它会创建多个 node.js 进程。但是还有一个称为集群管理器的主进程,负责监控应用程序各个实例的运行状况。

Node.js Interview Questions

54) Node.js 中的线程池是什么?哪个库处理它?

在 Node.js 中,libuv 库用于处理线程池。libuv 是一个多平台 C 库,支持基于异步 I/O 的操作,如文件系统、网络和并发。

Node.js Interview Questions