关于node.js:译使用频率最高的前30个Nodejs面试问题-の-1120

44次阅读

共计 5097 个字符,预计需要花费 13 分钟才能阅读完成。

作者 • Dhanjiv Pandey • 本文出处 • 已取得中译受权
• 作者 twitter
• 译者主页

译者按: 2018 年的文章,其中局部问题放在明天依然不算过期。

# Q-11:什么是回调天堂?

一开始,你能够在理解回调后褒扬它。回调天堂是大量嵌套的回调,这使得代码难以浏览和保护。

让咱们看看上面的代码示例:

downloadPhoto('http://coolcats.com/cat.gif', displayPhoto)
function displayPhoto (error, photo) {if (error) console.error('Download error!', error)
  else console.log('Download finished', photo)
}
console.log('Download started')

在这种状况下,Node.js 首先申明 displayPhoto 函数。尔后,它将调用 downloadPhoto 函数并传递 displayPhoto 函数作为其回调。最初,该代码在管制台上显示Download started。仅在 downloadPhoto 实现其所有工作的执行后,才会执行 displayPhoto

# Q-12:如何防止在 Node.js 呈现回调天堂?

Node.js 在外部应用单线程事件循环来解决排队的事件。然而,如果工作的运行工夫比预期的长,则此办法可能导致阻塞整个过程。

Node.js 通过合并回调(也称为 higher-order 函数)解决了此问题。因而,只有长时间运行的过程实现执行,就会触发关联的回调。通过这种办法,它能够容许代码在长时间运行的工作之后继续执行。

然而,上述解决方案看起来十分有前途。然而有时候,这可能会导致简单且无奈读取的代码。更多的状况下它会导致返回的回调链将更长。

因为这种前所未有的复杂性,调试代码十分艰难,可能会消耗大量工夫。有四种解决方案能够解决回调天堂问题。

1. 程序模块化.
它倡议将逻辑分为较小的模块。而后从主模块将它们连贯在一起以达到所需的后果。

2. 应用 async 机制.
它是一个宽泛应用的 Node.js 模块,提供了一个间断的执行流。
异步模块具备 async.waterfall API,该 API 应用下一个回调将数据从一个操作传递到另一操作。

另一个异步 API async.map 容许并行遍历我的项目列表,并应用另一个后果列表进行回调。

应用异步办法,调用者的回调仅被调用一次。这里的调用者是应用 async 模块的主办法。

3. 应用 promises 机制.
Promises 提供了另一种编写异步代码的办法. 它们要么返回执行后果,要么返回 error/exception. 实现 promise 须要应用 then() 函数,该函数期待 promise 对象返回。它带有两个可选参数,是两个函数。依据 promise 的状态,只有一个会被调用。如果 promise 失去实现,则将执行第一个函数调用。然而,如果 Promise 被回绝,则将调用第二个函数。

4. 应用 generators.
Generators 是轻量级的 routines,它们通过 yield 关键字使函数期待并复原。生成器函数应用非凡语法 function* ()。他们还能够应用诸如 promises 或thunks 之类的构造来暂停和复原异步操作,并将同步代码转换为异步代码。

# Q-13:你能用 Nodejs 创立 HTTP 服务器吗,解释一下你应用的代码?

是的,咱们能够在 Node.js 中创立 HTTP Server。咱们能够应用 http-server 命令来执行此操作。

以下是示例代码:

var http = require('http');
var requestListener = function (request, response) {response.writeHead(200, {'Content-Type': 'text/plain'});
  response.end('Welcome Viewers\n');
}
var server = http.createServer(requestListener);
server.listen(8080); // The port where you want to start with.

# Q-14:Nodejs、AJAX 和 jQuery 之间的区别是什么?

Node.js,AJAX 和 jQuery 之间的一个独特特色是它们都是 JavaScript 的高级实现。然而,它们的用处齐全不同。

Node.js –
它是用于开发客户端服务器应用程序的服务器端平台。例如,如果咱们必须构建一个在线员工管理系统,那么咱们就不会应用客户端 JS 来实现它。然而 Node.js 当然能够做到这一点,因为它运行在相似于 Apache 的服务器上,而不是运行在浏览器上。

AJAX (aka Asynchronous Javascript and XML) –
它是一种客户端脚本技术,次要用于出现页面内容而不刷新页面。

jQuery –
它是驰名的 JavaScript 模块,对 AJAX、DOM 遍历、循环等进行了补充。这个库提供了许多有用的函数来帮忙 JavaScript 开发。不过,应用它不是强制性的,它还治理跨浏览器的兼容性,所以能够帮忙您生成高度可保护的 web 应用程序。

# Q-15:Node.js 中的 Globals 是什么?

Node.js 中有三个关键字形成 Globals。它们是 GlobalProcessBuffer

Global
Global 关键字示意全局名称空间对象。它充当所有其余 global 对象的容器。如果咱们输出console.log(global),它会全副打印进去。

对于全局对象要留神的重要一点是,并非所有对象都在全局范畴内,其中一些属于模块范畴。因而,不应用 var 关键字申明它们或将它们增加到 Global 对象是理智的。

应用 var 关键字申明的变量在模块中变为局部变量,而那些没有申明的变量会订阅到全局对象。

Process
它也是全局对象之一,但蕴含将同步性能转换为异步回调的其余性能。从代码中的任何中央拜访它都没有限度。它是 EventEmitter 类的实例。每个 node application object 都是 Process 对象的一个​​实例。

它次要返回无关应用程序或环境的信息。

  • <process.execPath> – 获取 Node 应用程序的执行门路.
  • <process.Version> – 获取以后正在运行的 Node 版本.
  • <process.platform> – 获取服务器平台.

其余一些有用的解决办法如下:

  • <process.memoryUsage> – 理解 node 程序应用的内存.
  • <process.NextTick> – 附加一个将在下一个循环中调用的回调函数。它会导致函数提早执行.

Buffer
Buffer 是 Node.js 中解决二进制数据的一个类。它相似于整数列表,然而存储在 V8 堆之外的原始内存中。

咱们能够将 JavaScript 字符串对象转换为 Buffers。但这须要显式地申明编码类型。

  • <ascii> – 指定 7 位 ASCII 数据.
  • <utf8> – 示意多字节编码的 Unicode 字符集.
  • <utf16le> – 示意 2 或 4 个字节,用小尾数编码的 Unicode 字符.
  • <base64> – 用于 Base64 字符串编码.
  • <hex> – 将每个字节编码为两个十六进制字符.

这是应用 Buffer 类的语法:

> var buffer = new Buffer(string, [encoding]);

下面的命令将调配一个新的 buffer 来保留默认编码为 utf8 的字符串。然而,如果您想将 string 写入现有的buffer object,请应用以下代码行:

> buffer.write(string)

buffer 还提供其余办法,例如 readInt8writeUInt8,该办法容许从各种类型的数据读 / 写到 buffer。

# Q-16:如何在 Node.js 中加载 HTML?

要在 Node.js 中加载 HTML,咱们必须将 HTML 代码中的 Content-type 从 text/plain 更改为 text/html。
让咱们看一个在 web 服务器中创立动态文件的示例:

fs.readFile(filename, "binary", function(err, file) {if (err) {response.writeHead(500, {"Content-Type": "text/plain"});
    response.write(err + "\n");
    response.end();
    return;
  }

  response.writeHead(200);
  response.write(file, "binary");
  response.end();});

当初,咱们将批改此代码以加载 HTML 页面而不是纯文本。

fs.readFile(filename, "binary", function(err, file) {if (err) {response.writeHead(500, {"Content-Type": "text/html"});
    response.write(err + "\n");
    response.end();
    return;
  }

  response.writeHead(200, {"Content-Type": "text/html"});
  response.write(file);
  response.end();});

# Q-17:Node.js 中的 EventEmitter 是什么?

Node.js 中的事件模块容许咱们创立和解决自定义事件。事件模块蕴含 EventEmitter类,可用于引发和解决自定义事件。可通过以下代码进行拜访:

// 导入事件模块
var events = require('events');

// 创立一个 eventEmitter 对象
var eventEmitter = new events.EventEmitter();

当 EventEmitter 实例遇到谬误时,它将触发 error 事件。增加新的侦听器时,将触发 newListener事件,而删除侦听器时,将触发 removeListener事件。
EventEmitter 提供多个属性,例如 onemiton属性用于将函数绑定到事件,emit用于触发事件。

# Q-18:Node.js 中有几种类型的流?

Node.js 中的 Stream 是容许以间断形式从源读取数据或将数据写入特定指标的对象。在 Node.js 中,有四种类型的流:

  • <Readable> – 这是用于读取操作的 Stream.
  • <Writable> – 它简化了写的操作.
  • <Duplex> – 此流可用于读取和写入操作.
  • <Transform> – 它是双工流的一种模式,它依据可用的输出执行计算.

下面探讨的所有流都是 EventEmitter 类的实例。由流抛出的事件随工夫而变动。一些罕用事件如下:

  • <data> – 当有可供读取的数据时,将触发此事件.
  • <end> – 没有更多数据可读取时,Stream 将触发此事件.
  • <error> – 当读取或写入数据时呈现任何谬误时触发此事件.
  • <finish> – 当所有数据刷新到底层零碎后,将触发此事件.

# Q-19:列出并解释重要的 REPL 命令?

上面是一些最罕用的 REPL 命令:

  • <.help> – 显示所有命令的帮忙.
  • <tab Keys> – 它显示所有可用命令的列表.
  • <Up/Down Keys> – 它的用处是确定之前在 REPL 中执行了什么命令.
  • <.save filename> – 将以后的 REPL 会话保留到文件中.
  • <.load filename> – 在以后 REPL 会话中加载指定的文件.
  • <ctrl + c> – 用于终止以后命令.
  • <ctrl + c (twice)> – 退出 REPL.
  • <ctrl + d> – 此命令执行从 REPL 退出.
  • <.break> – 从多行表达式导出.
  • <.clear> – 从多行表达式退出.

# Q-20:Node.js 中的 NPM 是什么?

NPM 是 Node 的一个包管理器,也是一个平台。它提供以下两个次要性能:

  • 它作为 node.js 包 / 模块的在线存储库,这些包 / 模块存在于 <nodejs.org>(译者:不应该是 npmjs.com 吗?)中。
  • 它作为命令行工具来安装包,执行 Node.js 软件包的版本治理和依赖关系治理。

NPM 与 Node.js 捆绑在一起装置。咱们能够应用以下命令:

# 验证它的版本
$ npm --version

# 应用以下命令帮忙装置任何 Node.js 模块。# $ npm install <Module Name>

# 例如,上面是装置一个驰名的 Node.js web 框架模块 express- 的命令
$ npm install express

# 未完待续 …

正文完
 0