varutil=require("util");varEventEmitter=require("events");functionMyStream(){EventEmitter.call(this);}util.inherits(MyStream,EventEmitter);MyStream.prototype.write=function(data){this.emit("data",data);}varstream=newMyStream();console.log(streaminstanceofEventEmitter);//trueconsole.log(MyStream.super_===EventEmitter);//truestream.on("data",function(data){console.log('Receiveddata:"'+data+'"');})stream.write("Itworks!");数据Buffer全局,无需require('buffer')内存是被复制的,内存被解释成一个数组
用来转换纯ASCII符号和Unicode符号的工具类
Example:TinyCLI
varreadline=require('readline'),rl=readline.createInterface(process.stdin,process.stdout);rl.setPrompt('OHAI>');rl.prompt();rl.on('line',function(line){switch(line.trim()){case'hello':console.log('world!');break;default:console.log('SaywhatImighthaveheard`'+line.trim()+'`');break;}rl.prompt();}).on('close',function(){console.log('Haveagreatday!');process.exit(0);});多线程child-processclusterNode.js是单线程,cluster可以很容易创建共享服务器端口的子进程,注意子进程的状态不要与自身代码有关,尽可能的依赖第三方来存储状态,避免状态同步问题
这个接口从不缓冲整个请求或响应。用户可以对它们使用流键是小写的,值没有被修改原始消息头会被保留在rawHeaders属性中
HTTPS是建立在TLS/SSL之上的HTTP协议
该模块提供了异步网络调用的包装
该模块包含两类函数
socket通过require('dgram')使用
该模块提供了URL解析和解释工具
varEventEmitter=require('events')所有触发事件的对象都是events.EventEmitter的实例,事件名建议以驼峰字符串命名默认event都有error事件,默认没有添加监听器,默认行为是打印堆栈信息并退出程序
所有的流都是EventEmitter实例,流是可读,可写或者双向的
模块加载系统,该模块已经被锁定
提供了Gzip/Gunzip,Deflate/Inflate和DeflateRaw/InflateRaw类的绑定。每个类都有相同的选项,并且都是可读/可写流。
process是一个全局对象,是EventEmitter的一个实例
tty功能基本上不直接使用,只在检测是否处于tty环境的时候使用,包含tty.ReadStreamtty.WriteStream两个class
process.stdout.on('resize',function(){console.log('screensizehaschanged!');console.log(process.stdout.columns+'x'+process.stdout.rows);});v8v8内部的接口暴露
JavaScript代码会被编译且立刻执行或编译,保存,并且稍后执行。
tls模块使用OpenSSL来提供传输层的安全和/或安全socket层:已加密的流通信。TLS/SSL是一种公/私钥架构。每个客户端和每个服务器都必须有一个私钥。一个私钥通过像如下的方式创建:
所有的服务器和部分的客户端需要一个证书。证书是被CA签名或自签名的公钥。
为了完全向前保密(PFS),需要产生一个迪菲-赫尔曼参数
减缓客户端发起的重新协商攻击
NPN通过多个协议(HTTP,SPDY)使用一个TLS服务器。SNI通过多个有不同的SSL证书的主机名来使用一个TLS服务器。
完全向前保密通过在每次握手中(而不是所有的会话都是同样的密钥)随机地产生用于密钥-协商的密钥对来实现。实现了这个技术的方法被称作ephemeral
存在性能问题,因为密钥的生成是昂贵的
向用户隐藏实现细节
functionMyError(){Error.captureStackTrace(this,MyError);}//withoutpassingMyErrortocaptureStackTrace,theMyError//framewouldshouldupinthe.stackproperty.bypassing//theconstructor,weomitthatframeandallframesaboveit.newMyError().stack