0

0

深入了解Node.js中的一些特性_node.js

php中文网

php中文网

发布时间:2016-05-16 16:35:29

|

1461人浏览过

|

来源于php中文网

原创

node.js作为一门新兴的后台语言,旨在帮助程序员快速构建可伸缩的应用程序。node.js有很多吸引人的地方,有关它的报道不计其数,本文将针对eventemitter、streams、coding style、linting、coding style等特性进行分析探讨,帮助用户对node.js有更深入的了解。

作为一个基于Chrome JavaScript 运行时建立的平台,我们对JavaScript 的相关认识,似乎都可应用于node应用程序之上;无需额外的语言扩展或修饰,我们便可以把前端编程的经验应用于后端编程。

EventEmitter(事件发送器)

首先应该先了解EventEmitter模型。它可以发送一个事件以及让消费者订阅感兴趣的事件。我们可以把它看成是向一个异步函数进行回调传递模式的扩展。特别是,当需要进行多次回调时,EventEmitter会更显优势。

例如,有一个调用者向远程服务器发送了一个“列出文件”的请求。你可能想对返回结果进行分组,对每一个分组进行一次回调处理。EventEmitter模型可以让你在每一个分组上发送“文件”回调,当全部操作完成时进行“结束”处理。

使用EventEmitter时,只需设置好相关事件和参数。

复制代码 代码如下:

var EventEmitter = require('events').EventEmitter; 
var util = require('util'); 
 
function MyClass() { 
  if (!(this instanceof MyClass)) return new MyClass(); 
 
  EventEmitter.call(this); 
 
  var self = this; 
  setTimeout(function timeoutCb() { 
    self.emit('myEvent', 'hello world', 42); 
  }, 1000); 

util.inherits(MyClass, EventEmitter); 

MyClass构造函数创建了一个时间触发器,触发延时为1s,触发事件为myEvent。要使用相关事件,需要执行on()方法:

复制代码 代码如下:

var myObj = new MyClass(); 
var start = Date.now(); 
myObj.on('myEvent', function myEventCb(str, num) { 
  console.log('myEvent triggered', str, num, Date.now() - start); 
}); 

这里要注意的是,订阅的EventEmitter事件虽然是异步事件,但当时间触发时,监听方的动作是会同步的。因此如果上述myEvent事件有10个监听者,所有的监听会被按次序调用而不用等候事件的循环。

如果EventEmitter的一个子类生成了一个emit(‘error')事件,但是无任何的监听方对此进行订阅,那么EventEmitter基类会抛出一个异常,从而导致当执行process对象时触发uncaughtException事件。

verror

verror是基类Error的扩展,可以让我们使用printf字符格式定义输出消息。

Streams(流)

如果有一个非常庞大的文件需要处理,理想的方法应该是读一部分,写一部分,不管文件有多大,只要时间允许,总会处理完成,这里就需要用到流的概念。Streams是Node中另一个广泛使用的模型,在Node中是EventEmitter的实现。提供了可读、可写或者是全双工接口。它是一个抽象接口,提供的常规操作事件包括:readable、writable、 drain、data、 end及close。如果我们能够使用pipeline(管道)来对这些事件进行有效整合,将可实现功能更强大的交互操作。

透过使用.pipe(),可以让Note通过pipeline与back-pressure进行通信。back-pressure的意思是:只读取那些能够写入的,或只写入那些能够读取的。

例如我们现在把来自stdin的数据发送到一个本地文件和远程服务器:

复制代码 代码如下:

var fs = require('fs');
var net = require('net');

var localFile = fs.createWriteStream('localFile.tmp');

net.connect('255.255.255.255', 12345, function(client) {
  process.stdin.pipe(client);
  process.stdin.pipe(localFile);
});

而如果我们想发送数据到一个本地文件,并想使用gunzip对这个stream进行压缩,可以这样做:

复制代码 代码如下:

var fs = require('fs');
var zlib = require('zlib');

process.stdin.pipe(zlib.createGunzip()).pipe(fs.createWriteStream('localFile.tar'));

如果想对stream有更多了解,请点击这里

Control Flow(流程控制)

由于JS中有第一类对象,闭包等功能概念,因而能够容易地对回调权限进行定义。这在进行原型设计时是非常方便的,能够对逻辑权限按需进行整合。但是同时容易造成使用笨拙的内置函数。

宠物商店
宠物商店

目前,PetShop已经从最初的2.0、3.0等版本,发展到了最新的4.0版本。PetShop 4.0使用ASP.NET 2.0技术开发,其中加入了众多新增特性,因此,在性能、代码数量、可扩展性等方面有了重大改善。可以说,学习PetShop 4.0是深入掌握ASP.NET 2.0技术的捷径。本节将引领读者逐步了解PetShop 4.0的方方面面,包括应用程序安装、功能和用户界面简介、解决方案和体系

下载

例如我们想按次序读入一系列文件,然后执行某个任务:

复制代码 代码如下:

fs.readFile('firstFile', 'utf8', function firstCb(err, firstFile) {
  doSomething(firstFile);
  fs.readFile('secondFile', 'utf8', function secondCb(err, secondFile) {
    doSomething(secondFile);
    fs.readFile('thirdFile', 'utf8', function thirdCb(err, thirdFile) {
      doSomething(thirdFile);
    });
  });
});

这个模式存在的问题是:

1.这些代码的逻辑非常散乱无序,相关的操作流程难以理解。
2.没有任何差错或异常处理。
3.JS中闭包内存泄漏是非常常见的,并难以诊断和探测。

如果我们想在一个输入集上进行一系列异步操作,使用一个流程控制库是更明智的选择。这里使用的是vasync。

vasync是一个流程控制库,其思路来源于异步操作。它的特别之处是能够让消费者对某个任务处理过程进行查看和观察。这些信息对研究某个错误的产生过程是非常有用的。

Coding Style(编程风格)

编程风格可谓最具争议性的话题,因为很多时候都是随性的。萝卜白菜,各有所爱。重要的是找到适合个人和团队的风格。一些传统的传承或许能够让Node开发之旅变得更美好。

1.为函数命名
2.尽量对所有函数进行命名。
3.避免闭包
4.不要在某个函数中定义其它函数。这可减少很多想不到的闭包内存泄露意外。
5.更多和更小巧的函数

V8 JIT虽然是一个功能强大的引擎,但是更小巧和精简的函数会与V8结合得更好。进一步说,如果我们的函数都是小巧玲珑的(100行左右),我们自己进行阅读和维护时也会感谢自己的。

用编程方式检查风格:保持风格一致性,并使用一个检查工具来加强。我们使用的是jsstyle。

Linting(代码检查)

Lint工具可以在不运行情况下进行代码的静态分析,检查出潜在的错误和风险,例如在caseswitch中遗漏了break语句。Lint不简单地等同于风格检查,它更针对于客观的风险分析,而不是主观的风格选择。我们使用的javascriptlint,它里面有丰富检查项目。

Logging(日志记录)

当我们进行程序设计和编码时,需要有长远的目光。特别是要考虑好使用什么工具来进行调试。极好的第一步是进行有效日志记录。我们需要对信息进行识别,看看什么是调试时特别留意的,什么是运行时用来分析研究的。这里推荐使用Bunyan,一个直接的Node.js日志记录库,数据输出格式是JSON ,要了解更多信息,请点击这里。

Client Server

如果一款应用具备分布式处理能力,在市场上会更有吸引力。类似的接口可以用HTTP RESTFul API或原始的TCP JSON来描述。这可以让开发者把Node上的经验与异步网络环境相结合,以及把streams的使用与分布式可扩展式系统相结合。

常用工具:

1. restify

简单来说,这是一个用于构建REST服务的工具。它提供了良好的查看和调试处理支援,同时支持Bunyan与DTrace。

2. fast

fast是一款以TCP来处理JSON消息的轻量级工具。提供了DTrace支持,能够让我们迅速地对服务器客户端进行性能特征识别。

3. workflow

workflow构建于restify之上,能够对一系列远程服务和API进行业务流程定义。例如:错误状态,超时,重新连接,拥塞处理等。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
全国统一发票查询平台入口合集
全国统一发票查询平台入口合集

本专题整合了全国统一发票查询入口地址合集,阅读专题下面的文章了解更多详细入口。

12

2026.02.03

短剧入口地址汇总
短剧入口地址汇总

本专题整合了短剧app推荐平台,阅读专题下面的文章了解更多详细入口。

19

2026.02.03

植物大战僵尸版本入口地址汇总
植物大战僵尸版本入口地址汇总

本专题整合了植物大战僵尸版本入口地址汇总,前往文章中寻找想要的答案。

11

2026.02.03

c语言中/相关合集
c语言中/相关合集

本专题整合了c语言中/的用法、含义解释。阅读专题下面的文章了解更多详细内容。

2

2026.02.03

漫蛙漫画网页版入口与正版在线阅读 漫蛙MANWA官网访问专题
漫蛙漫画网页版入口与正版在线阅读 漫蛙MANWA官网访问专题

本专题围绕漫蛙漫画(Manwa / Manwa2)官网网页版入口进行整理,涵盖漫蛙漫画官方主页访问方式、网页版在线阅读入口、台版正版漫画浏览说明及基础使用指引,帮助用户快速进入漫蛙漫画官网,稳定在线阅读正版漫画内容,避免误入非官方页面。

8

2026.02.03

Yandex官网入口与俄罗斯搜索引擎访问指南 Yandex中文登录与网页版入口
Yandex官网入口与俄罗斯搜索引擎访问指南 Yandex中文登录与网页版入口

本专题汇总了俄罗斯知名搜索引擎 Yandex 的官网入口、免登录访问地址、中文登录方法与网页版使用指南,帮助用户稳定访问 Yandex 官网,并提供一站式入口汇总。无论是登录入口还是在线搜索,用户都能快速获取最新稳定的访问链接与使用指南。

92

2026.02.03

Java 设计模式与重构实践
Java 设计模式与重构实践

本专题专注讲解 Java 中常用的设计模式,包括单例模式、工厂模式、观察者模式、策略模式等,并结合代码重构实践,帮助学习者掌握 如何运用设计模式优化代码结构,提高代码的可读性、可维护性和扩展性。通过具体示例,展示设计模式如何解决实际开发中的复杂问题。

2

2026.02.03

C# 并发与异步编程
C# 并发与异步编程

本专题系统讲解 C# 异步编程与并发控制,重点介绍 async 和 await 关键字、Task 类、线程池管理、并发数据结构、死锁与线程安全问题。通过多个实战项目,帮助学习者掌握 如何在 C# 中编写高效的异步代码,提升应用的并发性能与响应速度。

2

2026.02.03

Python 强化学习与深度Q网络(DQN)
Python 强化学习与深度Q网络(DQN)

本专题深入讲解 Python 在强化学习(Reinforcement Learning)中的应用,重点介绍 深度Q网络(DQN) 及其实现方法,涵盖 Q-learning 算法、深度学习与神经网络的结合、环境模拟与奖励机制设计、探索与利用的平衡等。通过构建一个简单的游戏AI,帮助学习者掌握 如何使用 Python 训练智能体在动态环境中作出决策。

2

2026.02.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Node.js 教程
Node.js 教程

共57课时 | 10.2万人学习

【web前端】Node.js快速入门
【web前端】Node.js快速入门

共16课时 | 2万人学习

Node.js-前端工程化必学
Node.js-前端工程化必学

共19课时 | 3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号