后端资源精选小程序

NodeJS 官方文档v5.3.0 学习笔记

2015-12-26  本文已影响1185人  KeKeMars

https://nodejs.org/api/documentation.html

工具模块

Assert 测试 断言库 (功能已锁定)

Utitlies 工具类 (稳定)

var util = require("util");
var EventEmitter = require("events");

function MyStream() {
  EventEmitter.call(this);
}

util.inherits(MyStream, EventEmitter);

MyStream.prototype.write = function(data) {
  this.emit("data", data);
}

var stream = new MyStream();

console.log(stream instanceof EventEmitter); // true
console.log(MyStream.super_ === EventEmitter); // true

stream.on("data", function(data) {
  console.log('Received data: "' + data + '"');
})
stream.write("It works!"); 

数据

Buffer 全局, 无需require('buffer')

内存是被复制的, 内存被解释成一个数组

punycode

用来转换纯ASCII符号和Unicode符号的工具类

queryStrings

stringDecoder

readline

Example: Tiny CLI

var readline = 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('Say what? I might have heard `' + line.trim() + '`');
      break;
  }
  rl.prompt();
}).on('close', function() {
  console.log('Have a great day!');
  process.exit(0);
});

多线程

child-process

cluster

Node.js是单线程, cluster可以很容易创建共享服务器端口的子进程, 注意子进程的状态不要与自身代码有关, 尽可能的依赖第三方来存储状态, 避免状态同步问题

网络

http

这个接口从不缓冲整个请求或响应。用户可以对它们使用流
键是小写的, 值没有被修改
原始消息头会被保留在rawHeaders属性中

https

HTTPS是建立在TLS/SSL之上的HTTP协议

net

该模块提供了异步网络调用的包装

dns

该模块包含两类函数

udp/datagram

socket通过require('dgram')使用

url

该模块提供了URL解析和解释工具

基类

events

var EventEmitter = require('events')
所有触发事件的对象都是events.EventEmitter的实例, 事件名建议以驼峰字符串命名
默认 event 都有error事件, 默认没有添加监听器, 默认行为是打印堆栈信息并退出程序

stream

所有的流都是EventEmitter实例, 流是可读,可写或者双向的

用途 需要实现的方法
只读 Readable _read
只写 Writable _write, _writev
可读以及可写 Duplex _read, _write, _writev
操作被写入数据,然后读出结果 Transform _transform, _flush

在实现代码中,非常重要的一点是永远不要调用面向流消费者的 API。否则,在程序中消费你的流接口时可能有潜在的副作用。

- `Class: stream.Duplex` 需要实现`_read(size)`和`_write(chunk, encoding, callback)`
  - `new stream.Duplex(options)`
    - `options`
      - `allowHalfOpen` Boolean 默认为true。如果设置为false,那么流的可读的一端结束时可写的一端也会自动结束,反之亦然。
      - `readableObjectMode` Boolean 默认为false,为流的可读的一端设置objectMode。当objectMode为true时没有效果。
      - `writableObjectMode` Boolean 默认为false,为流的可写的一端设置objectMode。当objectMode为true时没有效果。
- `Class: stream.PassThrough`  这是一个`Transform`流的实现。将输入的流简单地传递给输出。它的主要目的是用来演示和测试,但它在某些需要构建特殊流的情况下可能有用。
- `Class: stream.Readable`
  - `new stream.Readable([options])` 需要实现底层`_read(size)`
    - `options`
      - `highWaterMark` Number 在停止从底层资源读取之前,在内部缓冲中存储的最大字节数。默认为16kb,对于objectMode则是16
      - `encoding` String 如果被指定,那么缓冲将被利用指定编码解码为字符串,默认为null
      - `objectMode` Boolean 是否该流应该表现如一个对象的流。意思是说stream.read(n)返回一个单独的对象而不是一个大小为n的Buffer,默认为false
  - `readable._read(size)` 
  - `readable.push(chunk[, encoding])`
  - `Example: A Counting Stream` **例子: 一个计数流**
  - `Example: SimpleProtocol v1 (Sub-optimal)` **例子:简单协议v1(次优)**
- `Class: stream.Transform` “转换”流是一个输出于输入存在对应关系的双工流,如一个`zilib`流或一个`crypto`流。除了实现`_read()`方法和`_write()`方法,转换流还必须实现`_transform()`方法,并且可选地实现`_flush()`方法
  - `new stream.Transform([options])`
  - `Events: 'finish' and 'end'`
  - `transform._flush(callback)` 当排空所有剩余数据后, `callback`会被调用
  - `transform._transform(chunk, encoding, callback)`
    - `chunk` Buffer | String 将要被写入的数据块。除非decodeStrings配置被设置为false,否则将一直是一个buffer
    - `encoding` String 如果数据块是一个字符串,那么这就是编码的类型。如果是一个 buffer,那么则会忽略它
    - `callback` Function 当你处理完给定的数据块后调用这个函数
  - `Example: SimpleProtocol parser v2` **简单协议解析器v2**
- `Class: stream.Writable` 需要实现底层`_write(chunk, encoding, callback)`
  - `new stream.Writable([options])`
    - `options`
      - `highWaterMark` Number write()方法开始返回false的缓冲级别。默认为16 kb,对于objectMode流则是16
      - `decodeStrings` Boolean 是否在传递给write()方法前将字符串解码成Buffer。默认为true
      - `objectMode` Boolean 是否write(anyObj)为一个合法操作。如果设置为true你可以写入任意数据而不仅是Buffer或字符串数据。默认为false
  - `writable._write(chunk, encoding, callback)`
    - `chunk` Buffer | String 将要被写入的数据块。除非decodeStrings配置被设置为false,否则将一直是一个buffer
    - `encoding` String 如果数据块是一个字符串,那么这就是编码的类型。如果是一个buffer,那么则会忽略它
    - `callback` Function 当你处理完给定的数据块后调用这个函数
  - `writable._writev(chunks, callback)`
    - `chunks` Array 将被写入的数据块数组。其中每一个数据都有如下格式:{ chunk: ..., encoding: ... }
    - `callback` Function 当你处理完给定的数据块后调用这个函数

文件 及 模块

filesystem

文件系统, 所有的方法都有异步和同步两种形式。

modules

模块加载系统, 该模块已经被锁定

path

zlib

提供了Gzip/GunzipDeflate/InflateDeflateRaw/InflateRaw类的绑定。每个类都有相同的选项,并且都是 可读/可写流

系统

os

获取操作系统相关信息

process

process是一个全局对象, 是EventEmitter的一个实例

tty

tty 功能基本上不直接使用, 只在检测是否处于 tty 环境的时候使用, 包含tty.ReadStream tty.WriteStream两个class

process.stdout.on('resize', function() {
  console.log('screen size has changed!');
  console.log(process.stdout.columns + 'x' + process.stdout.rows);
});

v8

v8内部的接口暴露

vm

JavaScript代码会被编译且立刻执行 或 编译,保存,并且稍后执行。

安全

crypto

tls/ssl

tls模块使用 OpenSSL 来提供传输层的安全 和/或 安全socket层:已加密的流通信。
TLS/SSL 是一种公/私钥架构。每个客户端和每个服务器都必须有一个私钥。一个私钥通过像如下的方式创建:

所有的服务器和部分的客户端需要一个证书。证书是被 CA 签名或自签名的公钥。

为了完全向前保密(PFS),需要产生一个 迪菲-赫尔曼 参数

减缓客户端发起的重新协商攻击

NPN 通过多个协议(HTTP,SPDY)使用一个 TLS 服务器。
SNI 通过多个有不同的 SSL 证书的主机名来使用一个 TLS 服务器。

完全向前保密
通过在每次握手中(而不是所有的会话都是同样的密钥)随机地产生用于密钥-协商的密钥对来实现。实现了这个技术的方法被称作ephemeral

存在性能问题, 因为密钥的生成是昂贵的

调试

console

debugger

error

向用户隐藏实现细节

function MyError() {
  Error.captureStackTrace(this, MyError);
}

// without passing MyError to captureStackTrace, the MyError
// frame would should up in the .stack property. by passing
// the constructor, we omit that frame and all frames above it.

new MyError().stack

repl

一种交互运行javascript的环境

global

timers

时间相关函数, 全局有效

上一篇 下一篇

猜你喜欢

热点阅读