Node.js,作为一种新的语言背景,旨在帮助程序员快速构建可扩展的applications.node.js有许多吸引人的方面。关于它有很多报道。本文将分析和讨论的特点流EventEmitter,编码风格,Linting风格,帮助用户对Node.js有更深的了解。

作为一个基于Chrome Javascript运行时的平台,我们对Javascript的理解似乎被应用到节点应用程序中。如果没有额外的语言扩展或修改,我们可以将前端编程的经验应用到后端编程中。

EventEmitter(事件发送器)

首先,我们应该先了解EventEmitter模型。它可以发送一个事件并允许用户订阅感兴趣的事件,我们可以看到它作为一个异步转移模式的回调函数的一个扩展。特别是,EventEmitter将更为有利时,许多回调是必要的。

例如,有一个电话,发送一个请求到远程服务器列表文件,你可能想组的返回结果,并为每个组做一个回调过程,模型允许你发送EventEmitter对每一组文件回调完成所有操作完成时。

利用EventEmitter时,只有相关的事件和参数设置。

复制代码代码如下所示:

Var EventEmitter要求EventEmitter('events);

VaR工具=需要('util);



函数的MyClass(){

如果(!(!(instanceof MyClass))MyClass()返回新的;



eventemitter.call(本);



var =;

setTimeout(function(){ timeoutcb)

Self.emit('myevent,你好世界,42);

},1000);

}

util.inherits(MyClass,EventEmitter);



MyClass的构造函数创建一个时间触发,触发延迟1秒,和触发事件的事件。使用相关的事件,你需要执行的()方法:

复制代码代码如下所示:

MyClass()=新的VaR myobj时;

var启动= Date.now();

MyObj.on('myevent,功能myeventcb(STR,努姆){

console.log('myevent触发,STR,民,Date.now()启动);

});



需要注意的是,该事件是异步EventEmitter订阅的重要,但当时间触发,听者的行动是同步的。因此,如果上述事件的事件有10听众,听众都称为无需等待事件的环。

如果一个类生成一个发出EventEmitter(错误的)事件,但没有听众订阅它,然后EventEmitter基类抛出异常,从而触发事件时,执行过程对象的uncaughtException。

verror

verror是一个扩展基类的错误,允许我们用printf输出消息格式定义字符。

流(流)

如果有一个非常大的文件要处理,理想的方法应该是读一部分和写一部分。不管文件有多大,如果时间允许的话,它会被处理,所以我们需要使用流的概念。流是另一种广泛使用的模型的节点,这是EventEmitter的节点执行。一个可读写的,或是全双工接口提供的。这是一个抽象的接口提供定期的操作事件包括:可读,可写,漏,数据,和关闭。如果我们可以使用管道(管道)有效地整合这些事件,我们可以实现更强大的交互操作。

用。管(),可以让你注意与背压通过pipeline.back-pressure手段只读那些可以写,或只写那些可以读。

例如,我们现在发送的数据输入到本地文件和远程服务器:

复制代码代码如下所示:

VaR FS =需要('fs);

无功网=需要('net);

无功localfile = fs.createwritestream('localfile。TMP);

net.connect('255.255.255.255 ',12345、功能(客户端){

process.stdin.pipe(客户端);

process.stdin.pipe(localfile);

});



如果我们想将数据发送到一个本地文件,想用gunzip压缩流,我们可以这样做:

复制代码代码如下所示:

VaR FS =需要('fs);

VaR zlib =需要('zlib);

process.stdin.pipe(zlib.creategunzip()),Pipe(fs.createwritestream('localfile。焦油));



如果您想了解更多关于流的信息,请点击这里。

控制流(过程控制)

由于js具有第一类对象、闭包和其他函数概念,所以很容易定义回调权限,这对于原型设计非常方便,能够根据需要集成逻辑权限,但同时也很容易使用笨拙的内置函数。

例如,我们希望按顺序读取一系列文件,然后执行任务:

复制代码代码如下所示:

fs.readfile('firstfile ','utf8,功能firstcb(呃,firstfile){

DoSomething(firstfile);

fs.readfile('secondfile ','utf8,功能secondcb(呃,secondfile){

DoSomething(secondfile);

fs.readfile('thirdfile ','utf8,功能thirdcb(呃,thirdfile){

DoSomething(thirdfile);

});

});

});



这个模式的问题是:

1。这些代码的逻辑非常混乱无序,相关的操作过程很难理解。

2。没有错误或异常处理。

在3.js封闭包内存泄漏是很常见的,很难诊断和检测。

如果我们想在输入的一组做了一系列的异步操作,这是使用过程控制图书馆更明智的选择。vasync用在这里。

vasync是过程控制库的想法来自于异步操作。特别是它允许用户查看和观察任务的处理过程。这些信息是研究犯错误的过程中非常有用。

编码风格(编程风格)

编程风格是最具争议性的话题,因为很多时候都是休闲的,萝卜白菜,都有爱情,重要的是找到适合个人和团队的风格,一些传统的传承也许能使节点发展的旅程更好。

1。命名函数

2。尝试命名所有函数。

三.避免关闭

4。不要在函数中定义其他函数,这样可以减少很多意想不到的内存泄漏事故。

5。越来越小的函数

V8是一个功能强大的引擎,但是更小更精简的功能会更好地与V8引擎结合在一起。此外,如果我们的功能都是小而精致的(大约100行),我们也会感谢我们自己的阅读和维护。

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

Linting(代码检查)

皮棉工具可以执行的代码静态分析不运行,检查潜在的错误和风险,如丢失在caseswitch break语句。皮棉并不能简单的等同于风格的检查,它比主观风格选择目标风险分析更加敏感。我们用javascriptlint,里面包含了很多的检验项目。

日志(日志记录)

当我们做程序设计和编码,我们需要有一个长期的目标。特别是,考虑使用什么样的工具来调试。优秀的第一步是制定一个有效的日志记录。我们需要确定的信息,看看有什么是特别小心调试时,什么是用来分析和研究运行。建议使用班扬,直接Node.js日志记录库和数据输出格式JSON。要获得更多信息,请单击此处。

客户端服务器

如果应用程序具有分布式处理能力,它将在市场上更具吸引力。类似的接口可以用HTTP RESTful API或原始TCP JSON。这允许开发者结合异步网络环境下节点的经验和数据流的分布式可扩展的系统结合使用。

常用工具:

1。restify

简而言之,这是一个建筑的REST服务的工具。它提供了良好的视野和调试支持,同时支持Bunyan和DTrace。

2。快速的

快是TCP处理JSON消息一个轻量级的工具。它DTrace支持,使我们能够快速识别客户提供服务器性能特点。

三.工作流

工作流是建立在restify可以定义一系列远程服务和API的业务流程。例如,错误状态,超时,重联,拥塞处理等。