node.js入门手册_Node.js入门

node.js入门手册

现在是凌晨3点,您将手放在键盘上,盯着一个空的控制台。 在黑暗背景下的明亮提示已准备就绪,渴望接受命令。 是否想破解Node.js一段时间?

Node.js令人兴奋的一件事是它可以在任何地方运行。 这为尝试堆栈提供了各种可能性。 对于任何经验丰富的老手来说,这都是命令行工具的有趣选择。 额外的特别之处在于,我们可以从命令行的安全网内检查堆栈。 而且我们仍然在谈论JavaScript是很酷的-因此,大多数熟悉JS的读者应该都不会对理解它的工作原理有任何疑问。 那么,为什么不在控制台中启动node呢?

在本文中,我们将向您介绍Node.js。 我们的目标是在攀登高点的同时浏览主要亮点。 这是堆栈的中间概述,同时将其全部保留在控制台中。 如果您想使用Node.js的入门指南,请参阅SitePoint的“使用Node.js构建简单的后端项目”课程。

Windows控制台中的Node.js

为什么选择Node.js?

在开始之前,让我们研究一下使Node.js在人群中脱颖而出的花絮:

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

您可能已经通过许多渠道听到了这些观点,但这意味着什么呢? 您可以将Node.js视为将许多API公开给JavaScript语言的引擎。 在传统的计算(过程是同步的)中,当您执行任何I / O操作时,API会等待其运行下一行代码。 I / O操作是例如读取文件或进行网络调用。 Node.js不会这样做; 从一开始就设计为具有异步操作。 在当今的计算机市场中,这具有巨大的优势。 您能想到上一次购买新计算机时,因为它具有更快的单处理器吗? 内核数量和更快的硬盘驱动器更为重要。

在本文的其余部分中,当看到一个> ,它是一个提示符号,表示您应按Enter键入下一个命令。 此外,在运行本文中的代码之前,您必须打开CLI并执行命令node 。 话虽如此,让我们开始旅程!

回呼

首先,键入以下功能:

> function add(a, b, callback) { var result = a + b; callback(result); }

对于新手来说,JavaScript中的回调似乎很奇怪。 当然,它看起来不像任何经典的OOP方法。 在JavaScript中,函数是对象,对象可以将其他对象作为参数。 JavaScript并不在乎对象拥有什么,因此,一个函数可以接受一个恰好是另一个函数的对象。 Arity是参数的数量,它从add()中的两个变为回调中的单个参数。 该回调系统功能强大,因为它可以实现封装和隐藏实现。

在Node.js中,您会发现很多将回调作为参数的API。 考虑回调的一种方法是作为委托。 除了编程语言外,委托人是被派遣并有权代表他人的人。 因此,回调就像发送某人来执行任务。 给定参数列表(例如,杂货店列表),他们可以自己去执行任务。

要玩add

> add(2, 3, function (c) { console.log('2 + 3 = ' + c) });
> add(1, 1, function (c) { console.log('Is 1 + 1 = 3? ' + (c === 3)); });

有很多创造性的方法可以处理回调。 回调是Node.js中一些重要API的构建块。

异步操作

通过回调,我们能够开始构建异步API。 例如:

> function doSomething (asyncCallback) { asyncCallback(); }
> doSomething(function () { console.log('This runs synchronously.'); });

此特定示例具有同步执行。 但是,我们拥有实现JavaScript异步性所需的一切。 例如, asyncCallback可以在同一线程中延迟:

> function doSomething (asyncCallback) { setTimeout(asyncCallback, Math.random() + 1000); }
> doSomething(function () { console.log('This runs asynchronously.'); }); console.log('test');

我们使用setTimeout延迟当前线程中的执行。 超时不能保证执行时间。 我们放置一个Math.random()使其更加善变,并调用doSomething() ,然后调用console.log('test') ,以显示延迟执行。 您将经历一到两秒钟的短暂延迟,然后在屏幕上看到一条消息弹出。 这说明异步回调是不可预测的。 Node.js将此回调放置在调度程序中,并以其愉快的方式继续进行。 当计时器触发时,Node.js将从执行发生的地方接起并调用回调。 因此,您必须将注意力集中在繁琐的回调上,以了解Node.js。

简而言之,回调并不总是像在JavaScript中那样。

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

> dns.lookup('bing.com', function (err, address, family) { console.log(' Address: ' + address + ', Family: '  + family + ', Err: ' + err); });

回调返回erraddressfamily对象。 重要的是,返回值将作为参数传递给回调。 因此,这与传统的var result = fn('bing.com'); API不同var result = fn('bing.com'); 。 在Node.js中,您必须获取回调和异步才能了解全局。 (有关更多详细信息,请参阅DNS Node.js API 。)这是在控制台中DNS lookupc的外观:

Node.js DNS查找

文件I / O

免费学习PHP!

全面介绍PHP和MySQL,从而实现服务器端编程的飞跃。

原价$ 11.95 您的完全免费

现在,让我们加快步伐,在Node.js上执行文件I / O。 想象一下在这种情况下,您打开一个文件,读取它,然后将内容写入其中。 在现代计算机体系结构中,I / O绑定操作会滞后。 CPU寄存器速度快,CPU缓存速度快,RAM速度快。 但是您去磁盘读写时,它会变慢。 因此,当同步程序执行I / O绑定操作时,它运行缓慢。 更好的选择是异步执行此操作,如下所示:

> var fs = require('fs');
> fs.writeFile('message.txt', 'Hello Node.js', function () { console.log('Saved.'); }); console.log('Writing file...');

由于该操作是异步的,因此在将文件保存到磁盘之前,您会看到“正在写入文件…”。 回调函数的自然用法非常适合此API。 从该文件读取怎么样? 您能猜到如何在Node.js中做到这一点吗? 我们会给您一个提示:回调接受errdata 。 试试看。

答案是:

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

您也可以传入encoding选项以获取文件的utf-8内容:

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

在Node.js中,将回调函数与异步I / O结合使用看起来很不错。 这样做的好处是我们利用了JavaScript中的基本构建块。 借助不阻塞的异步API,回调已提升到全新的令人敬畏的水平。

Web服务器

那么,Web服务器呢? Node.js的任何良好公开都必须运行Web服务器。 想象一下一个名为createServer的API,其中包含一个接受requestresponse的回调。 您可以在文档中浏览HTTP API 。 您能想到它的外观吗? 您将需要http模块。 继续并开始在控制台中输入。

答案是:

> var http = require('http');
> var server = http.createServer(function (request, response) { response.end('Hello Node.js'); });

Web基于请求和响应的客户端-服务器模型。 Node.js具有来自客户端的request对象和来自服务器的response对象。 因此,通过这种简单的回调机制,堆栈就包含了Web的关键。 当然,它是异步的。 我们在这里所做的与文件API没有什么不同。 我们引入一个模块,告诉它做某事并传递一个回调。 回调的工作原理类似于委托,该委托在给定参数列表的情况下执行特定任务。

当然,如果我们无法在浏览器中看到所有内容,那都是胡说八道。 要解决此问题,请在命令行中键入以下内容:

server.listen(8080);

将您喜欢的浏览器指向localhost:8080 ,在我的情况下为Edge。

Microsoft Edge上的Node.js

想象一下, request对象具有大量可用信息。 要重新连接server ,我们首先将其关闭:

> server.close();
> server = http.createServer(function (request, response) { response.end(request.headers['user-agent']); }); server.listen(8081);

将浏览器指向localhost:8081headers对象为您提供了来自浏览器的user-agent信息。 我们还可以遍历headers对象:

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

这次将浏览器指向localhost:8082 。 完成服务器的使用后,请确保将其关闭。 如果您不这样做,命令行可能会表现得很滑稽:

> server.close();

这样就可以通过命令行创建Web服务器。 希望您喜欢在node周围进行的迷幻之旅。

异步等待

ES 2017引入了异步功能。 从本质上讲,异步函数是在JavaScript中使用异步代码的一种更干净的方法。 创建Async / Await的目的是简化使用和编写链式承诺的过程。 您可能已经体验了无法阅读的链式代码会变成什么样。

创建async功能非常简单。 您只需要在函数之前添加async关键字:

async function sum(a,b) {
    return a + b;
}

让我们谈论await 。 如果我们要强制其余代码等待Promise解析并返回结果,则可以使用await 。 Await仅适用于Promises; 它不适用于回调。 另外, await只能在async功能中使用。

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

function tripleAfter1Second(number) {
    return new Promise(resolve => {
        setTimeout(() => {
            resolve(number * 3);
        }, 1000);
    });
}

使用then ,我们的代码如下所示:

tripleAfter1Second(10).then((result) => {
    console.log(result); // 30
}

接下来,我们要使用async / await。 我们要强制我们的代码在执行任何其他操作以得到此结果之前,等待三倍的值。 在下面的示例中,如果没有await关键字,我们将收到一条错误消息,告诉我们不可能采用'undefined'模数,因为我们还没有三倍的值:

const finalResult = async function(number) {
    let triple = await tripleAfter1Second(number);
    return triple % 2;
}

关于异步/等待的最后一句话:当心未捕获的错误。 使用then链时,我们可以使用catch结束它,以捕获执行期间发生的任何错误。 但是,await不提供此功能。 为确保捕获所有错误,将try … catch语句置于try … catch语句周围是一个好习惯: try … catch块:

const tripleResult = async function(number) {
    try {
        return await tripleAfter1Second(number);
    } catch (error) {
        console.log("Something wrong: ", error);
    }
}

要更深入地了解async / await,请查看使用异步功能简化异步编码

结论

Node.js简单而轻便,非常适合现代解决方案。 它采用无阻塞设计,充分利用了现代硬件的优势。 它包含了Web固有的客户端-服务器模型。 最棒的是,它运行JavaScript-这是我们喜欢的语言。

吸引人的是,堆栈的关键并不是那么新。 从一开始,Web就建立在轻便,可访问的模块周围。 有时间时,请务必阅读Tim Berners-Lee的设计原则 。 如果可以选择使用JavaScript,则最低功耗原则适用于Node.js。

希望您喜欢命令行工具。 骇客骇客!

本文由Rabi Kiran同行评审。 感谢所有SitePoint的同行评审员使SitePoint内容达到最佳状态!

翻译自: https://www.sitepoint.com/a-beginner-splurge-in-node-js/

node.js入门手册

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值