Node.js的初学者挥霍

分享

现在是凌晨三点。你的手放在键盘上,盯着一个空的控制台。黑暗背景上明亮的提示符已经准备好了,渴望接受命令。想要破解一下Node.js吗?

关于Node.js的一个令人兴奋的事情是它可以在任何地方运行。这为试验堆栈提供了各种可能性。对于任何经验丰富的老手来说,这是一个有趣的命令行工具运行。更特别的是,我们可以从命令行的安全网内调查堆栈。很酷的是,我们仍然在谈论JavaScript——所以大多数熟悉JS的读者应该不会有任何问题来理解它是如何工作的。所以,为什么不发动起来呢节点在控制台?

在本文中,我们将向您介绍Node.js。我们的目标是在攀登一些相当高的地方的同时浏览主要亮点。这是堆栈的中间概述,同时将其全部保存在控制台中。如果你想要一个初学者友好的Node.js指南,请查看SitePoint的必威西盟体育网页登录用Node.js构建一个简单的后端项目课程。

Node.js在Windows控制台中

为什么node . js ?

在我们开始之前,让我们回顾一下让Node.js脱颖而出的花絮:

  • 它是为非阻塞I/O设计的
  • 它是为异步操作设计的
  • 它运行在Chrome的V8 JavaScript引擎上。

你可能从很多渠道听到过这些观点,但它们都是什么意思呢?您可以将Node.js视为向JavaScript语言公开许多api的引擎。在传统计算中,进程是同步的,当您执行任何I/O操作时,API在运行下一行代码之前会等待。例如,I/O操作是读取文件或进行网络调用。Node.js不会这样做;它从一开始就被设计为具有异步操作。在当今的计算市场中,这具有巨大的优势。你还记得上一次你买一台新电脑是因为它有更快的单处理器吗?核心数量和更快的硬盘驱动器更重要。

在本文的剩余部分中,当您看到一个>,这是一个提示符号,它表示您应该点击输入键入下一个命令。此外,在运行本文中的代码之前,您必须打开CLI并执行命令节点.说到这里,让我们开始我们的旅行吧!

回调

首先,输入这个函数:

>函数添加(a, b,回调){var结果= a + b;回调(结果);}

对于新手来说,JavaScript中的回调可能看起来很奇怪。它看起来当然不像任何经典的OOP方法。在JavaScript中,函数是对象,对象可以接受其他对象作为参数。JavaScript并不关心对象有什么,所以函数可以接收恰好是另一个函数的对象。的参数数量,也就是参数的数量,从2开始add ()到回调中的单个参数。这个回调系统非常强大,因为它支持封装和实现隐藏。

在Node.js中,你会发现很多api都将回调作为参数。考虑回调的一种方法是作为一个委托。撇开编程术语不谈,委托是被派去并被授权代表其他人的人。回调就像派人去办事。给定一个参数列表,比如一个购物清单,它们可以自己去做一项任务。

玩一玩添加

>添加(2、3、函数(c) {console.log(“2 + 3 = ' + c)});> add(1,1, function (c) {console.log('Is 1 + 1 = 3?' + (c == 3));});

还有很多更有创意的方法来处理回调。回调是Node.js中一些重要api的构建模块。

异步操作

通过回调,我们可以开始构建异步api。例如:

>函数doSomething (asyncCallback) {asyncCallback();} > doSomething(function () {console.log('此同步运行。');});

这个特殊的例子有一个同步执行。但我们在JavaScript中拥有异步性所需的一切。的asyncCallback,例如,在同一个线程中可以被延迟:

>函数doSomething (asyncCallback) {setTimeout(asyncCallback, Math.random() + 1000);} > doSomething(function () {console.log('异步运行');});console.log(测试);

我们使用setTimeout延迟当前线程的执行。超时不能保证执行时间。我们放置一个math . random ()让它更善变的,还有叫doSomething (),然后是console.log(测试),显示延迟执行。你会经历一到两秒的短暂延迟,然后看到屏幕上弹出一条消息。这说明异步回调是不可预测的。Node.js将这个回调放在调度程序中,并继续它的快乐之路。当计时器触发时,Node.js就会在执行的地方调用回调。所以,为了理解Node.js,你必须把你的思想围绕在任性的回调上。

简而言之,回调并不总是像JavaScript中看起来的那样。

让我们继续做一些更酷的事情——比如在Node.js中进行简单的DNS查找:

> dns.lookup('bing.com',函数(err,地址,家庭){console.log('地址:' +地址+ ',家庭:' +家庭+ ',err: ' + err);});

回调函数返回犯错地址,家庭对象。重要的是返回值作为参数传递给回调。这和传统的API不一样Var result = fn('bing.com');.在Node.js中,你必须获得回调和异步来获得大局。(请参阅DNS Node.js API了解更多细节。)这是DNS lookupc在控制台上的样子:

Node.js DNS查找

文件I / O

现在让我们加快速度,在Node.js上进行文件I/O。想象一下这样的场景:您打开一个文件,读取它,然后将内容写入其中。在现代计算机体系结构中,受I/ o限制的操作会延迟。CPU寄存器快,CPU缓存快,内存快。但是当你对磁盘进行读写时,它就变慢了。因此,当同步程序执行I/ o约束操作时,它运行得很慢。更好的选择是异步完成,如下所示:

> var fs = require('fs');> fs.writeFile('message.txt', 'Hello Node.js', function () {console.log('Saved.');});console.log(“写文件…”);

因为操作是异步的,所以在文件保存到磁盘之前,您将看到“正在写入文件…”。回调函数的自然使用很适合这个API。从这个文件中读取如何?你能猜出在node。js中怎么做吗?我们会给你一个提示:回调接收犯错而且数据.试一试。

以下是答案:

> fs.readFile('message.txt', function(err, data) {console.log(data);});

你也可以通过一个编码选项,以获取utf - 8文件内容:

> fs.readFile('message.txt', {encoding: 'utf-8'}, function(err, data) {console.log(data);});

在Node.js中使用回调函数和异步I/O看起来很不错。这里的优点是我们利用了JavaScript中的一个基本构建块。通过异步api,回调被提升到一个全新的级别,它不会阻塞。

Web服务器

那么,网络服务器呢?任何好的exposé Node.js都必须运行web服务器。想象一个名为createServer用一个回调函数请求而且响应.你可以探索HTTP API在文档中。你能想到那是什么样子吗?你需要http模块。继续,开始在控制台中输入。

以下是答案:

> var HTTP = require(' HTTP ');> var server = http。createServer(函数(请求,响应){响应.结束(“你好node . js”);});

Web基于请求和响应的客户机-服务器模型。Node.js有一个请求对象的响应对象。因此,堆栈通过这种简单的回调机制包含了Web的关键。当然,它是异步的。我们在这里所做的与文件API并没有太大的不同。我们引入一个模块,告诉它做一些事情,并传入一个回调。回调的工作方式类似于指定参数列表执行特定任务的委托。

当然,如果我们不能在浏览器中看到它,那么一切都是无意义的。要解决这个问题,在命令行中输入以下命令:

server.listen (8080);

指向您最喜欢的浏览器localhost: 8080对我来说就是Edge。

Microsoft Edge上的Node.js

想象一下请求对象作为拥有大量可用信息的对象。要重新布线服务器,让我们先把它拿下来:

> server.close ();> server = http。createServer(函数(请求,响应){响应.end(request.headers['user-agent']); }); server.listen(8081);

将浏览器指向localhost: 8081.的对象给你用户代理来自浏览器的信息。我们也可以循环对象:

> server.close ();> server = http。createServer(函数(请求,响应){Object.keys(request.headers).forEach(function (key) { response.write(key + ': ' + request.headers[key] + ' '); }); response.end(); }); server.listen(8082);

将浏览器指向localhost: 8082这一次。一旦您完成了对服务器的操作,请确保将其关闭。如果你不这样做,命令行可能会变得很奇怪:

>server.close

这样你就可以通过命令行创建web服务器了。希望你们喜欢这次迷幻之旅节点

异步等待

ES 2017引入了异步函数。异步函数本质上是JavaScript中处理异步代码的一种更简洁的方式。Async/Await的创建是为了简化使用和编写链式承诺的过程。您可能已经体验过链式代码变得多么不可读。

创建一个异步函数非常简单。你只需要在函数之前添加async关键字:

异步函数总和一个b返回一个+b

我们来谈谈等待.我们可以用等待如果我们想强制其余的代码等待,直到Promise解析并返回一个结果。等待只对承诺有效;它对回调不起作用。此外,等待只能在异步函数。

考虑下面的代码,它使用Promise在一秒钟后返回一个新值:

函数tripleAfter1Second数量返回承诺解决= >setTimeout= >解决数量3.1000

当使用然后,我们的代码看起来像这样:

tripleAfter1Second10然后结果= >控制台日志结果/ / 30

接下来,我们要使用async/await。我们希望强制代码在对该结果执行任何其他操作之前等待三倍的值。没有等待关键字,在下面的例子中,我们会得到一个错误,告诉我们不可能取' undefined '的模量,因为我们还没有得到我们的三倍值:

常量finalResult异步函数数量三倍等待tripleAfter1Second数量返回三倍2

关于async/await的最后一点说明:注意未捕获的错误。当使用然后链,我们可以用它来结束捕获执行期间发生的任何错误。然而,await并不提供这一点。为了确保捕捉到所有错误,一个很好的实践是在await语句周围加上试着…布洛克:

常量tripleResult异步函数数量试一试返回等待tripleAfter1Second数量错误控制台日志“出问题了。”错误

有关async/await的更深入介绍,请查看用异步函数简化异步编码

结论

Node.js非常适合现代解决方案,因为它简单且轻量级。它利用了现代硬件的非阻塞设计。它包含了Web固有的客户机-服务器模型。最重要的是,它运行JavaScript——这是我们喜爱的语言。

堆栈的症结并不新鲜,这一点很吸引人。Web从诞生之初就围绕轻量级、可访问的模块构建。如果你有时间,一定要读蒂姆·伯纳斯·李的书设计原则.考虑到使用JavaScript的选择,最小功耗原则适用于Node.js。

希望您喜欢这篇关于命令行工具的介绍。黑客快乐!

本文由拉比Kiran.感谢所有SitePoint的同行审必威西盟体育网页登录稿人,让SitePoint的内容成为最好的!

Baidu