面试题整理|50个NodeJS面试题

面试题整理|50个NodeJS面试题

    • 初级NodeJS面试题
    • 中级NodeJS面试题
    • 高级NodeJS面试题
    • 《Nodejs仿微博网站》

面试题整理|50个NodeJS面试题_第1张图片

Node.js是一种服务器端脚本工具,使用它可以轻松构建从简单的命令行程序到复杂的企业级 Web 应用程序的所有内容。
本篇文章,将为大家分享50个和NodeJS相关的面试题及其解析,难度分为:初级、中级、高级三个部分,由易到难,循序渐进。

初级NodeJS面试题

Q1、如何区分 JavaScript 和 Node.js?

特征 JavaScript NodeJS
类型 编程语言 JavaScript 的解释器和环境
公用事业 用于 Web 应用程序的任何客户端活动 用于访问或执行任何操作系统的任何非阻塞操作
运行引擎 蜘蛛猴 (FireFox)、JavaScript Core (Safari)、V8 (Google Chrome) 等 V8 (Google Chrome)

Q2、什么是NodeJS?
Node.js 是在Chrome 的 V8 JavaScript 引擎上开发的极其强大的框架 ,可将 JavaScript 直接编译为原生机器码。它是一个轻量级框架,用于创建服务器端 Web 应用程序并扩展 JavaScript API 以提供常用的服务器端功能。它通常用于大型应用程序开发,特别是视频流站点、单页应用程序和其他 Web 应用程序。

Q3、列出NodeJS的优势?

特征 描述
快速 Node.js 建立在 Google Chrome 的 V8 JavaScript 引擎之上,这使得它的库在代码执行方面非常快
异步 基于 Node.js 的服务器从不等待 API 返回数据,从而使其异步
可扩展 它是高度可扩展的,因为它的事件机制可以帮助服务器以非阻塞方式响应
开源 Node.js 拥有一个广泛的开源社区,该社区贡献了一些优秀的模块来为 Node.js 应用程序添加附加功能
无缓冲 Node.js 应用程序只是以块的形式输出数据,从不缓冲任何数据

Q4、Angular 和 Node.js 有什么区别

Angular NodeJS
它是一个开源的Web应用程序开发框架 它是应用程序的跨平台运行时环境
它是用TypeScript编写的 它是用C、C++ 和 JavaScript 语言编写的
用于构建单页面客户端web应用 用于构建快速且可扩展的服务器端网络应用程序
Angular本身就是一个web 应用框架 Node.js 有许多不同的框架, 如 Sails.js、Partial.js 和 Express.js 等
非常适合创建高度活跃和交互式的网络应用程序 非常适合开发小型项目
有助于将应用程序拆分为MVC组件 有助于生成数据库查询
适合开发实时应用 适用于需要更快和更具可扩展性的情况

Q5、NodeJS的单线程模型?

Node.js 使用单线程模型来支持异步处理。通过异步处理,应用程序可以在 Web 负载下性能更好并且更具可扩展性。因此,Node.js 使用单线程模型方法而不是典型的基于线程的实现。

Q6、NodeJS是如何工作的?
Node.js 是一个使用 JavaScript 作为脚本语言并在 v8 环境中运行的虚拟机。它在单线程事件循环和非阻塞 I/O 上提供高速率工作,因为它可以处理更多并发请求。此外,通过使用“HTTP”模块,Node.js 可以在任何独立的 Web 服务器上运行。

Q7、NodeJS的应用领域?
1、实时网络应用程序
2、网络应用
3、分布式系统
4、通用应用

Q8、NodeJS中有多少种API函数?
有两种类型API函数

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

Q9、异步和非阻塞有什么区别?

  • 异步
  • 非阻塞

异步意味着不同步。使用这些我们可以发出不等待服务器响应的异步 HTTP 请求。这些函数继续响应它已经收到服务器响应的请求。 非阻塞函数用于 I/O 操作。他们立即响应任何可用数据,并根据请求继续运行。如果无法检索到任何答案,则 API 会立即返回并显示错误。

Q10、package.json是什么文件?
Node.js 中的 package.json文件是整个应用程序的核心。它是包含项目元数据的清单文件,我们在其中定义了包的属性。

Q11、你对事件驱动编程的理解是什么?
事件驱动编程是一种大量使用事件来触发各种函数的方法。事件可以是鼠标单击、按键等任何事件。当事件发生时,将执行已向元素注册的回调函数。这种方法主要遵循发布订阅模式。由于事件驱动编程的特点,使得Node.js 与其他技术相比速度更快。

Q12、NodeJS中事件循环是什么,如何工作?
Node.js 中的事件循环处理应用程序中的所有异步回调。它是 Node.js 最重要的特征之一,也是 Node.js 具有非阻塞 I/O 的原因。由于 Node.js 是一种事件驱动的语言,你可以轻松地将侦听器附加到事件,然后当事件发生时回调将由特定的侦听器执行。每当调用 setTimeout、http.get 和 fs.readFile 等函数时,Node.js 都会执行事件循环,然后继续执行进一步的代码,而无需等待输出。整个操作完成后,Node.js 接收输出,然后执行回调函数。这就是为什么所有的回调函数都被放置在一个循环的队列中。一旦收到响应,它们就会被一一执行。
面试题整理|50个NodeJS面试题_第2张图片

Q13、在NodeJS上下文中解释REPL

REPL在Node.js的代表:R-Read,E-Eval,P-Print,L-Loop。它代表一个计算机环境,例如窗口控制台或 Unix/Linux shell,可以在其中输入任何命令,然后系统可以输出响应。默认情况下,Node.js 与 REPL 环境捆绑在一起。REPL 可以执行以下列出的任务:

  • Read:读取用户的输入,将其解析为 JavaScript 数据结构,然后将其存储在内存中。
  • Eval:接收并评估数据结构。
  • Print:打印最终结果。
  • Loop:循环提供的命令,直到按两次CTRL+C。

Q14、列出应该使用事件循环异步完成的任务

  1. 输入/输出操作
  2. 繁重的计算
  3. 任何需要阻塞的东西

Q15、列出使用“控制流”控制 Node.js 中函数调用的步骤

  1. List item
  2. 控制执行顺序
  3. 收集数据
  4. 限制并发
  5. 调用程序的下一步

中级NodeJS面试题

Q16、你对测试金字塔的理解是什么?
测试金字塔基本上是一个图表,它描述了为了项目的成功开发需要编写多少单元测试、集成测试和端到端测试的比例。
图片

Q17、Node.js 中的错误优先回调是什么?
Node.js 中的错误优先回调用于传递错误和数据。你需要传递给这些函数的第一个参数必须是一个错误对象,而其他参数代表相关数据。因此,你可以传递错误对象以检查是否有任何错误并进行处理。如果没有问题,可以继续使用后续参数。

var myPost = new Post({title: 'edureka'});
myPost.save(function(err,myInstance){
if(err){
//处理错误并返回
}
//继续 `myInstance`
});

Q18、解释module.exports的用途?
Node.js 中的一个模块用于将所有相关代码封装到一个代码单元中,该代码单元可以通过将所有相关功能转移到单个文件中来进行解释。例如,假设您有一个名为 greet.js 的文件,其中包含如下所示的两个函数:

module.exports = {
greetInHindi: function(){
return "NAMASTE";
},
greetInKorean: function(){
return "ANNYEONGHASEYO";
}};

如你所见,module.exports 提供了两个函数,可以使用以下代码将它们导入到另一个文件中:

var eduGreets = require ("./greet.js");
eduGreets.greetInHindi() //NAMASTE
eduGreets.greetInKorean() //ANNYEONGHASEYO

Q19、你对Node.js中的Reactor Pattern有什么理解?
Node.js 中的Reactor Pattern基本上是一个非阻塞 I/O 操作的概念。该模式提供了一个与每个 I/O 操作相关联的处理程序,一旦生成 I/O 请求,它就会提交给多 路分解器。该解复用器是一个通知接口,能够在非阻塞 I/O 模式下处理并发。它还有助于以事件的形式收集每个请求,然后将每个事件放入队列中。从而导致事件队列的产生。同时,我们有事件循环,它迭代事件队列中存在的事件。

Q20、“前端”和“后端”开发有什么区别?

前端 后端
使用 HTML、CSS、JavaScript等标记和网络语言 使用Python、Ruby、Perl等编程和脚本语言。
基于异步请求和AJAX 基于服务器架构
更好的可访问性 增强的安全性|
用于搜索引擎优化 用于备份

Q21. Node.js 的 LTS 版本是什么?

LTS代表Long Term Support版本的Node.js,接收安全更新和性能改进以及所有关键bug修复。主要关注稳定性和安全性。对 LTS 版本所做的修改仅限于错误修复、安全升级、npm 和文档更新、性能改进等。

Q22. 列出 Node.js 中的主要安全实现?

  • 身份验证
  • 错误处理

Q23. 你怎么理解回调地狱?

回调地狱也被称为末日金字塔。这是一种由密集嵌套的回调引起的模式,这些回调不可读且笨拙。它通常包含多个嵌套的回调函数,从而使代码难以阅读和调试。它是由异步逻辑的不当实现引起的。

async_A(function(){
async_B(function(){
async_C(function(){
async_D(function(){
....
});
});
});
});

Q24. 解释libuv?

Libuv 是Node.js的多平台支持库,主要用于异步 I/O。它主要是为 Node.js 开发的,随着时间的推移,它被广泛用于其他系统,如 Luvit、pyuv、Julia 等。Libuv 基本上是对依赖于平台的 libev/IOCP 的抽象,为用户提供基于 libev 的 API。libuv 的一些重要特性是:

  • 支持全功能事件循环
  • 文件系统事件
  • 异步文件和文件系统操作
  • 异步 TCP 和 UDP 套接字
  • 子进程

Q25. 解释NodeJS中间件概念
一般来说,中间件是一个接收请求和响应对象的函数。换句话说,在应用程序的请求-响应循环中,这些函数可以访问各种请求和响应对象以及循环的下一个函数。中间件的 next 功能是借助一个变量来表示的,通常命名为 next。中间件功能最常执行的任务是:

  • 执行任何类型的代码
  • 更新或修改请求和响应对象
  • 完成请求-响应循环
  • 调用堆栈中的下一个中间件

Q26.解释URL模块的概念?

Node.js的 URL 模块提供了各种用于URL 解析和解析的实用程序 。它是一个内置模块,有助于将网址拆分为可读格式:

var url = require('url');

例如:

var url = require('url');
var adrs = 'http://localhost:8082/default.htm?year=2021&month=July';
var q = url.parse(adr, true);
console.log(q.host); //returns 'localhost:8082'
console.log(q.pathname); //returns '/default.htm'
console.log(q.search); //returns '?year=2021 and month=July'
var qdata = q.query; //returns an object: { year: 2021, month: 'July' }
console.log(qdata.month); //returns 'July'

Q27.你对ESLint的理解是什么?

ESLint 是一个开源项目,最初由 Nicholas C. Zakas 于 2013 年开发,旨在通过插件为 JavaScript 提供 linting 实用程序。Node.js 中的 Linters 是搜索某些 bug 类的好工具,尤其是那些与变量作用域相关的 bug。

Q28.对于 Node.js,为什么 Google 使用 V8 引擎?

Google 使用 V8,因为它是一个 Chrome 运行时引擎,可以将JavaScript 代码转换为本地机器代码。这反过来又加快了应用程序的执行和响应过程,并为您提供了一个快速运行的应用程序。

Q29.解释控制流的工作?
在 Node.js 中,控制流函数基本上是在异步函数调用之间执行的代码。以下是执行它必须遵循的步骤:
首先,必须控制执行顺序。
然后,需要收集所需的数据。
其次,必须限制并发。
完成后,必须调用程序的下一步。

Q30.列出 async.queue 作为输入的两个参数?
下面是 async.queue 作为输入的两个参数:

  1. 任务功能
  2. 并发值

Q31.Node.js 中 spawn() 和 fork() 方法的区别?

在 Node.js 中, spawn() 用于使用提供的命令集启动新进程。此方法不会创建新的 V8 实例,并且只有一个节点模块副本在处理器上处于活动状态。当你的子进程向 Node 返回大量数据时,可以调用此方法。
语法:

child_process.spawn(command[, args][, options])

而 Node.js 中的 fork() 是 spawn() 的一个特殊实例,它执行 V8 引擎的一个新实例。这种方法只是意味着多个工作程序在单个 Node 代码库上运行以执行各种任务。
语法:

child_process.fork(modulePath[, args][, options])

Q32、Node.js中的全局对象是怎么理解的?
在 Node.js 中,全局对象本质上是全局的,并且在应用程序的所有模块中都可用。您可以直接在应用程序中使用这些对象,而不必显式包含它们。全局对象可以是模块、函数、字符串、对象等。此外,这些对象中的一些可以在模块范围内而不是在全局范围内。

Q33、解释Node中存根的概念?
在 Node.js 中,存根基本上是用于刺激模块或组件行为的程序或函数。在任何测试用例中,存根都会提供函数的预设答案。

Q34、断言在NodeJS中如何工作?
在 Node.js 中,断言用于编写测试。它仅在任何正在运行的测试用例失败时才提供反馈。该模块为您提供了一组断言测试,然后用于测试不变量。它基本上由 Node.js 内部使用,但使用 require(‘assert’) 代码,它也可以在其他应用程序中使用。

Q35、定义测试金字塔的概念。从 HTTP API 的角度解释实现它们的过程
测试金字塔基本上是由 Mike Cohn 开发的一个概念。根据这一点,你应该有一个更高一些低级别的单元测试相比,高层次的终端到终端的测试,通过GUI运行。
就 HTTP API 而言,它可以定义为:

  • 每个模型的低级单元测试数量更多
  • 较少的集成测试来测试模型交互
  • 用于测试实际 HTTP 端点的较少验收测试

Q36、解释一下ExpressJS包的用途?
Express.js 是一个构建在 Node.js 之上的框架,它有助于管理服务器端应用程序中服务器和路由之间的数据流。它是一个轻量级且灵活的框架,可提供 Web 和移动应用程序开发所需的广泛功能。Express.js开发的中间件的Node.js的模块被称为 连接。connect 模块进一步利用 http 模块与 Node.js 通信。因此,如果您正在使用任何基于连接的中间件模块,那么您可以轻松地与 Express.js 集成。

Q37、process.nextTick() 和 setImmediate() 的区别?
  在 Node.js 中,process.nextTick() 和 setImmediate() 都是 Timers 模块的函数,它们有助于在预定义的时间段后执行代码。但是这些功能在执行上有所不同。process.nextTick 函数等待动作的执行,直到事件循环中的下一次传递,或者一旦事件循环完成,它就会调用回调函数。另一方面, setImmediate() 用于在事件循环的下一个周期执行回调方法,最终将其返回到事件循环以执行 I/O 操作。

Q38、解释Node.js中buffer类的用法?
Node.js 中的 Buffer 类用于以类似于整数数组的方式存储原始数据。但它对应于位于 V8 堆之外的原始内存分配。它是一个易于访问的全局类,无需导入缓冲模块即可在应用程序中访问。使用 Buffer 类是因为纯 JavaScript 与二进制数据不兼容。因此,在处理 TCP 流或文件系统时,有必要处理八位字节流。

Q39、NodeJS如何处理子线程?
 一般来说,Node.js 是一个单线程进程,不暴露子线程或线程管理方法。但是您仍然可以使用 spawn() 将子线程用于某些特定的异步 I/O 任务,这些任务在后台执行并且通常不执行任何 JS 代码或阻碍应用程序中的主事件循环。如果您仍然想在您的应用程序中使用线程概念,您必须明确地包含一个名为 ChildProcess 的模块。

Q40、相对,固定,绝对和静态定位的元素有什么区别?
Node.js 中的流是类似于数组和字符串的数据集合。它们是对象,您可以使用它们以连续方式从源读取数据或将数据写入目标。它可能无法立即使用,也不必放入内存中。这些流对于读取和处理大量数据特别有用。在 Node.js 中,流有四种基本类型:

  1. 可读: 用于从源读取大量数据。
  2. 可写:用于将大块数据写入目的地。
  3. 双工:用于两种功能;读和写。
  4. Transform:它是一种用于修改数据的双工流。

高级NodeJS面试题

Q41、NODE_ENV有什么用?
如果项目处于生产阶段,Node.js 提倡使用 NODE_ENV 变量来标记它的约定。这有助于在项目开发过程中做出更好的判断。此外,当您将 NODE_ENV 设置为生产时,您的应用程序的执行速度往往会快 3 倍。

Q42、Node.js 中 readFile 和 createReadStream 的区别?
Node.js 提供了两种读取和执行文件的方式,分别是使用 readFile 和 CreateStream。readFile() 是一个完全缓冲的进程,只有当完整的文件被推入缓冲区并被读取时才返回响应。这是一个内存密集型过程,在大文件的情况下,处理速度可能非常慢。而 createReadStream 是部分缓冲的,它将整个过程视为一个事件系列。整个文件被分成块,然后被处理并作为响应一一发回。完成后,它们最终会从缓冲区中删除。与 readFile 不同,createReadStream 对于大文件的处理非常有效。

Q43、列出 Node.js 的各种计时功能?
Node.js 提供了一个 Timers 模块,其中包含在指定时间段后执行代码的各种功能。下面我列出了这个模块提供的各种功能:

  1. setTimeout/clearTimeout – 用于在指定的毫秒数后安排代码执行
  2. setInterval/clearInterval – 用于多次执行一个代码块
  3. setImmediate/clearImmediate – 用于在当前事件循环周期结束时执行代码
  4. process.nextTick – 用于调度需要在事件循环的下一次迭代中调用的回调函数

Q44、解释Node.js中Punycode的概念
在 Node.js 中,Punycode 是一种编码语法,用于将 Unicode (UTF-8) 字符串转换为基本的 ASCII 字符串。这很重要,因为主机名只能理解 ASCII 字符。因此,从 Node.js 0.6.2 版本开始,它与默认的 Node 包捆绑在一起。如果您想将它与任何以前的版本一起使用,您可以使用以下代码轻松实现:
语法:

punycode = require('punycode');

Q45、Node.js 和 Ajax 的区别?
Node.js 和 Ajax 之间最基本的区别在于,Node.js 是服务器端 JavaScript,而 Ajax 是客户端技术。简单来说,Ajax 主要用于更新或修改网页内容,而无需刷新它。另一方面,Node.js 需要开发通常由服务器而不是 Web 浏览器执行的服务器软件。

Q46、Node.js 是否提供任何调试器?
Node.js 确实提供了一个简单的基于 TCP 的协议和内置的调试客户端。为了调试您的 JavaScript 文件,您可以使用下面的调试参数,后跟要调试的js文件名。
语法:

node debug [script.js | -e "script" | <host> : <port> ]

Q47、描述 Node.js 的退出代码?
在 Node.js 中,退出代码是一组用于完成特定进程的特定代码。这些进程也可以包括全局对象。下面是 Node.js 中使用的一些退出代码:

  • 未捕获的致命异常
  • 没用过
  • 致命错误
  • 内部异常处理程序运行时失败
  • 内部 JavaScript 评估失败

Q48、Node.js 中的 Event Emitter 是怎么理解的?
EventEmitter 是一个 Node.js 类,包含所有能够发出事件的对象。这些对象包含一个 eventEmitter.on() 函数,通过该函数可以将多个函数附加到对象发出的命名事件。每当 EventEmitter 对象抛出一个事件时,所有附加到该特定事件的函数都会被同步调用。下面的代码显示了如何在您的应用程序中使用 EventEmitter:

const EventEmitter = require('events');
class MyEmitter extends EventEmitter { }
const myEmitter = new MyEmitter();
myEmitter.on('event', () => {
console.log('an event occurred!');
});
myEmitter.emit('event');

Q49、解释为什么 Express ‘app’ 和 ‘server’ 必须分开的原因?
Express ‘app’ 和 ‘server’ 必须保持分开,因为这样做,您将 API 声明与网络相关配置分开,这有利于以下列出的方式:
它允许在进程内测试 API,而无需执行网络调用
更快的测试执行
获取更广泛的代码覆盖指标
允许在灵活的不同网络条件下部署相同的 API
更好地分离关注点和更清晰的代码
API 声明应驻留在 app.js 中:

var app = express();
app.use(bodyParser.json());
app.use("/api/events", events.API);
app.use("/api/forms", forms);

服务器网络声明应位于 /bin/www 中:

var app = require('../app');
var http = require('http');
//Get port from environment and store in Express
var port = normalizePort(process.env.PORT || '8000');
app.set('port', port);
//Create HTTP server.
var server = http.createServer(app);

Q50、Node.js 支持密码学吗?
是的,Node.js 确实通过名为 Crypto 的模块支持加密。该模块提供各种加密功能,如密码、解密、签名和验证功能,一组用于开放 SSL 的哈希 HMAC 的包装器等。例如:
语法:

const crypto = require'crypto');
const secret = 'akerude';
const hash = crypto.createHmac('swaEdu', secret).update('Welcome to Edureka').digest('hex');
console.log(hash);

关于NodeJS面试题就先简单给大家分享到这里!
掌握了这些面试题型后,还需要结合真实项目才能够融会贯通 !
下面课程将带你进入真实项目的应用,带大家掌握NodeJS!

《Nodejs仿微博网站》

面试题整理|50个NodeJS面试题_第3张图片
面试题整理|50个NodeJS面试题_第4张图片

前端学习扫码咨询
面试题整理|50个NodeJS面试题_第5张图片

你可能感兴趣的:(前端,node.js,javascript,面试)