• Node.js Video Tutorials

Node.js - 面试问题



亲爱的读者,这些Node.JS 面试问题是专门为了让您熟悉在面试Node.JS主题时可能遇到的问题类型而设计的。根据我的经验,优秀的面试官在面试过程中很少会计划要问什么具体问题,通常问题会从该主题的一些基本概念开始,然后根据进一步的讨论和您的回答继续下去。

Node.js 是一个基于 Google Chrome 的 JavaScript 引擎(V8 引擎)构建的 Web 应用程序框架。

Node.js 带有运行时环境,在此环境中可以解释和执行基于 JavaScript 的脚本(类似于 JAVA 字节码的 JVM)。此运行时允许在浏览器外部的任何机器上执行 JavaScript 代码。由于 Node.js 的此运行时,JavaScript 现在也可以在服务器上执行。

Node.js 还提供了一个丰富的各种 JavaScript 模块库,这在很大程度上简化了使用 Node.js 开发 Web 应用程序的过程。

Node.js = 运行时环境 + JavaScript 库

Node.js 库的所有 API 都是异步的,即非阻塞的。从本质上讲,这意味着基于 Node.js 的服务器永远不会等待 API 返回数据。服务器在调用下一个 API 后会继续执行,而 Node.js 的事件通知机制则帮助服务器获取先前 API 调用的响应。

以下是使用 Node.js 的主要好处

  • 异步和事件驱动Node.js 库的所有 API 都是异步的,即非阻塞的。从本质上讲,这意味着基于 Node.js 的服务器永远不会等待 API 返回数据。服务器在调用下一个 API 后会继续执行,而 Node.js 的事件通知机制则帮助服务器获取先前 API 调用的响应。

  • 非常快由于构建在 Google Chrome 的 V8 JavaScript 引擎之上,Node.js 库在代码执行方面非常快。

  • 单线程但高度可扩展 - Node.js 使用带有事件循环的单线程模型。事件机制帮助服务器以非阻塞方式响应,并使服务器具有高度可扩展性,这与创建有限线程来处理请求的传统服务器相反。Node.js 使用单线程程序,并且同一个程序可以为比 Apache HTTP 服务器等传统服务器多得多的请求提供服务。

  • 无缓冲 - Node.js 应用程序从不缓冲任何数据。这些应用程序只是分块输出数据。

是的!Node.js 是在 MIT 许可证 下发布的,并且可以免费使用。

是的!Node 使用带有事件循环的单线程模型。

REPL 代表 Read Eval Print Loop,它表示一个类似于窗口控制台或 unix/linux shell 的计算机环境,用户可以在其中输入命令,系统会以输出进行响应。Node.js 或 Node 自带 REPL 环境。它执行以下所需任务。

  • 读取 - 读取用户输入,将输入解析为 JavaScript 数据结构并存储在内存中。

  • 评估 - 获取并评估数据结构

  • 打印 - 打印结果

  • 循环 - 循环执行上述命令,直到用户连续按两次 ctrl-c。

是的。

使用变量存储值并在以后打印。如果未使用 var 关键字,则将值存储在变量中并打印。而如果使用 var 关键字,则会存储值但不会打印。您以后可以使用这两个变量。

使用_获取最后的结果。

C:\Nodejs_WorkSpace>node
> var x = 10
undefined
> var y = 20
undefined
> x + y
30
> var sum = _
undefined
> console.log(sum)
30
undefined
>

npm 代表 Node Package Manager。npm 提供以下两个主要功能

  • Node.js 包/模块的在线存储库,可在 search.nodejs.org 上搜索。

  • 命令行实用程序,用于安装包、执行版本管理和 Node.js 包的依赖项管理。

全局安装的包/依赖项存储在<用户目录>/npm 目录中。此类依赖项可用于任何 Node.js 的 CLI(命令行界面)功能,但不能直接在 Node 应用程序中使用 require() 导入。要全局安装 Node 项目,请使用 -g 标志。

C:\Nodejs_WorkSpace>npm install express -g

默认情况下,npm 会以本地模式安装任何依赖项。这里的本地模式是指将包安装在 Node 应用程序所在的文件夹中的 node_modules 目录中。本地部署的包可以通过 require() 访问。要本地安装 Node 项目,语法如下。

C:\Nodejs_WorkSpace>npm install express

使用以下命令 -

C:\Nodejs_WorkSpace>npm ls -g

package.json 位于任何 Node 应用程序/模块的根目录中,用于定义包的属性。

以下是 Package.json 的属性

  • name - 包的名称

  • version - 包的版本

  • description - 包的描述

  • homepage - 包的主页

  • author - 包的作者

  • contributors - 包的贡献者姓名

  • dependencies - 依赖项列表。npm 会自动安装此处在包的 node_module 文件夹中提到的所有依赖项。

  • repository - 包的存储库类型和 URL

  • main - 包的入口点

  • keywords - 关键字

使用以下命令卸载模块。

C:\Nodejs_WorkSpace>npm uninstall dependency-name

更新 package.json 并更改要更新的依赖项的版本,然后运行以下命令。

C:\Nodejs_WorkSpace>npm update

回调函数是函数的异步等效项。在完成给定任务后会调用回调函数。Node 大量使用了回调函数。所有 Node 的 API 都是以支持回调函数的方式编写的。例如,读取文件的函数可能会开始读取文件并立即将控制权返回给执行环境,以便可以执行下一条指令。文件 I/O 完成后,它将调用回调函数,同时将文件的内容作为参数传递给回调函数。因此,没有阻塞或等待文件 I/O。这使得 Node.js 具有高度可扩展性,因为它可以处理大量请求而无需等待任何函数返回结果。

如果应用程序必须等待某些 I/O 操作才能完成其进一步执行,则负责等待的代码称为阻塞代码。

通过提供回调函数。每当触发相应的事件时,都会调用回调函数。

Node js 是一个单线程应用程序,但它通过事件和回调函数的概念支持并发。由于 Node js 的每个 API 都是异步的,并且是一个单线程,因此它使用异步函数调用来维护并发。Node 使用观察者模式。Node 线程保持一个事件循环,每当任何任务完成时,它都会触发相应的事件,该事件会向事件监听器函数发出执行信号。

EventEmitter 类位于events模块中。可以通过以下语法访问它 -

//import events module
var events = require('events');

//create an eventEmitter object
var eventEmitter = new events.EventEmitter();

当 EventEmitter 实例遇到任何错误时,它会发出“error”事件。添加新监听器时,会触发“newListener”事件,而删除监听器时,会触发“removeListener”事件。

EventEmitter 提供了多个属性,如onemiton属性用于将函数绑定到事件,而emit用于触发事件。

Buffer 类是一个全局类,可以在应用程序中访问而无需导入 buffer 模块。Buffer 是一种整数数组,对应于 V8 堆之外的原始内存分配。Buffer 不能调整大小。

管道是一种将一个流的输出连接到另一个流的机制。它通常用于从一个流获取数据并将该流的输出传递到另一个流。管道操作没有限制。考虑上面的示例,我们使用 readerStream 读取 test.txt,并使用 writerStream 写入 test1.txt。现在,我们将使用管道来简化读取一个文件并写入另一个文件的操作。

fs 模块用于基于文件的操作。

var fs = require("fs")

buffer 模块用于基于缓冲区的操作。

var buffer = require("buffer")

http 模块用于基于 Web 的操作。

var http = require("http")

正确。

fs 模块中的每个方法都有同步和异步形式。异步方法将最后一个参数作为完成函数回调,回调函数的第一个参数是错误。建议使用异步方法而不是同步方法,因为前者永远不会阻塞程序执行,而后者会阻塞。

读写操作的标志如下:

  • r - 打开文件以进行读取。如果文件不存在,则会引发异常。

  • r+ - 打开文件以进行读写。如果文件不存在,则会引发异常。

  • rs - 以同步模式打开文件进行读取。指示操作系统绕过本地文件系统缓存。这主要用于打开 NFS 挂载上的文件,因为它允许您跳过可能过时的本地缓存。这对 I/O 性能有非常真实的影响,因此除非您需要,否则不要使用此标志。请注意,这不会将 fs.open() 变成同步阻塞调用。如果这就是您想要的,那么您应该使用 fs.openSync()

  • rs+ - 打开文件以进行读写,并告诉操作系统以同步方式打开它。有关谨慎使用此选项,请参阅“rs”的说明。

  • w - 打开文件以进行写入。如果文件不存在,则创建文件;如果文件存在,则截断文件。

  • wx - 类似于“w”,但如果路径存在则失败。

  • w+ - 打开文件以进行读写。如果文件不存在,则创建文件;如果文件存在,则截断文件。

  • wx+ - 类似于“w+”,但如果路径存在则失败。

  • a - 打开文件以进行追加。如果文件不存在,则创建文件。

  • ax - 类似于“a”,但如果路径存在则失败。

  • a+ - 打开文件以进行读取和追加。如果文件不存在,则创建文件。

  • ax+ - 类似于“a+”,但如果路径存在则失败。

流是对象,允许您以连续的方式从源读取数据或向目标写入数据。

在 Node.js 中,有四种类型的流。

  • Readable - 用于读取操作的流。

  • Writable - 用于写入操作的流。

  • Duplex - 可用于读写操作的流。

  • Transform - 一种双向流,其中输出基于输入计算。

每种类型的流都是 EventEmitter 实例,并在不同时间实例中抛出多个事件。例如,一些常用的事件是:

  • data - 当有数据可供读取时触发此事件。

  • end - 当没有更多数据可供读取时触发此事件。

  • error - 当接收或写入数据时发生任何错误时触发此事件。

  • finish - 当所有数据都已刷新到底层系统时触发此事件。

链式调用是一种机制,用于将一个流的输出连接到另一个流,并创建多个流操作的链。它通常与管道操作一起使用。

以下是异步模式下打开文件的函数语法:

fs.open(path, flags[, mode], callback)

参数

以下是使用参数的说明:

  • path - 这是一个包含路径的文件名字符串。

  • flags - 标志指示要打开的文件的行为。下面列出了所有可能的值。

  • mode - 这设置文件模式(权限和粘滞位),但仅当文件被创建时才设置。默认为 0666,可读和可写。

  • callback - 这是回调函数,它获取两个参数 (err, fd)。

以下是读取文件方法之一的语法:

fs.read(fd, buffer, offset, length, position, callback)

此方法将使用文件描述符读取文件,如果您想直接使用文件名读取文件,则应使用另一种可用方法。

参数

以下是使用参数的说明:

  • fd - 这是由文件 fs.open() 方法返回的文件描述符。

  • buffer - 这是将数据写入其中的缓冲区。

  • offset - 这是缓冲区中开始写入的位置的偏移量。

  • length - 这是一个整数,指定要读取的字节数。

  • position - 这是一个整数,指定从文件的哪个位置开始读取。如果 position 为 null,则将从当前文件位置读取数据。

  • callback - 这是回调函数,它获取三个参数 (err, bytesRead, buffer)。

以下是写入文件方法之一的语法:

fs.writeFile(filename, data[, options], callback)

如果文件已存在,此方法将覆盖该文件。如果您想写入现有文件,则应使用另一种可用方法。

参数

以下是使用参数的说明:

  • path - 这是一个包含路径的文件名字符串。

  • data - 这是要写入文件的字符串或缓冲区。

  • options - 第三个参数是一个对象,它将保存 {encoding, mode, flag}。默认编码为 utf8,模式为八进制值 0666,标志为“w”。

  • callback - 这是回调函数,它获取单个参数 err,并在发生任何写入错误时用于返回错误。

以下是关闭打开文件的方法之一的语法:

fs.close(fd, callback)

参数

以下是使用参数的说明:

  • fd - 这是由文件 fs.open() 方法返回的文件描述符。

  • callback - 这是回调函数,它不获取任何参数,除了可能给完成回调传递的异常之外。

以下是获取有关文件信息的方法的语法:

fs.stat(path, callback)

参数

以下是使用参数的说明:

  • path - 这是一个包含路径的文件名字符串。

  • callback - 这是回调函数,它获取两个参数 (err, stats),其中 stats 是 fs.Stats 类型的对象,在下面的示例中打印。

以下是截断打开文件的方法的语法:

fs.ftruncate(fd, len, callback)

参数

以下是使用参数的说明:

  • fd - 这是由文件 fs.open() 方法返回的文件描述符。

  • len - 这是文件截断后的长度。

  • callback - 这是回调函数,它不获取任何参数,除了可能给完成回调传递的异常之外。

以下是删除文件的方法的语法:

fs.unlink(path, callback)

参数

以下是使用参数的说明:

  • path - 这是包含路径的文件名。

  • callback - 这是回调函数,它不获取任何参数,除了可能给完成回调传递的异常之外。

以下是创建目录的方法的语法:

fs.mkdir(path[, mode], callback)

参数

以下是使用参数的说明:

  • path - 这是包含路径的目录名。

  • mode - 这是要设置的目录权限。默认为 0777。

  • callback - 这是回调函数,它不获取任何参数,除了可能给完成回调传递的异常之外。

以下是删除目录的方法的语法:

fs.rmdir(path, callback)

参数

以下是使用参数的说明:

  • path - 这是包含路径的目录名。

  • callback - 这是回调函数,它不获取任何参数,除了可能给完成回调传递的异常之外。

以下是读取目录的方法的语法:

fs.readdir(path, callback)

参数

以下是使用参数的说明:

  • path - 这是包含路径的目录名。

  • callback - 这是回调函数,它获取两个参数 (err, files),其中 files 是目录中文件名的数组,不包括“.”和“..”。

__filename 表示正在执行的代码的文件名。这是此代码文件的已解析绝对路径。对于主程序,这并不一定与命令行中使用的文件名相同。模块内的值是该模块文件的路径。

__dirname 表示当前正在执行的脚本所在的目录的名称。

setTimeout(cb, ms) 全局函数用于在至少 ms 毫秒后运行回调 cb。实际延迟取决于外部因素,如操作系统计时器粒度和系统负载。计时器不能超过 24.8 天。

此函数返回一个不透明值,表示可以用来清除计时器的计时器。

clearTimeout( t ) 全局函数用于停止之前使用 setTimeout() 创建的计时器。这里 t 是 setTimeout() 函数返回的计时器。

setInterval(cb, ms) 全局函数用于在至少 ms 毫秒后重复运行回调 cb。实际延迟取决于外部因素,如操作系统计时器粒度和系统负载。计时器不能超过 24.8 天。

此函数返回一个不透明值,表示可以用来使用 clearInterval(t) 函数清除计时器的计时器。

console 对象用于用于在 stdout 和 stderr 上打印信息。

process 对象用于获取有关当前进程的信息。提供与进程活动相关的多个事件。

接下来是什么?

接下来,您可以回顾一下您之前完成的与该主题相关的作业,并确保您能够自信地谈论它们。如果您是应届毕业生,面试官不会期望您回答非常复杂的问题,而是您必须使自己的基础概念非常牢固。

其次,如果您无法回答一些问题,其实并不重要,重要的是无论您回答了什么,都必须充满自信地回答。所以在面试时要保持自信。我们在 tutorialspoint 祝您面试顺利,并祝您未来的事业一切顺利。干杯 :-)

广告