Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# 前言

欢迎使用NodeJS 文档!

NodeJS中文文档,本书的[github](https://www.github.com/0532)地址
35 changes: 35 additions & 0 deletions SUMMARY.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# Summary

* [前言](README.md)
* [Synopsis 总述](synopsis/README.md)
* [Standard Modules 标准模块](standard_modules/README.md)
* [Buffers 缓存对象](buffers/README.md)
* [EventEmitter事件触发器](eventemitter/README.md)
* [Streams 流](streams/README.md)
* [Global Objects 全局对象](global_objects/README.md)
* [process 进程](process/README.md)
* [通过sys访问模块](sys/README.md)
* [Timers 计时器](timers/README.md)
* [Script 脚本](script/README.md)
* [fs对文件的操作](fs/README.md)
* [HTTP](http/README.md)
* [http.Server](httpserver/README.md)
* [http.ServerRequest](httpserverrequest/README.md)
* [http.ServerResponse](httpserverresponse/README.md)
* [http.Client](httpclient/README.md)
* [http.ClientRequest](httpclientrequest/README.md)
* [http.ClientResponse](httpclientresponse/README.md)
* [net.Server TCP服务器模块](netserver_tcp/README.md)
* [net.Stream TCP流模块](netstream_tcp/README.md)
* [Crypto 加密模块](crypto/README.md)
* [DNS 域名解析](dns/README.md)
* [dgram 数据报](dgram/README.md)
* [Assert 断言](assert/README.md)
* [Path模块](path/README.md)
* [URL模块](url/README.md)
* [Query String 查询字串](query_string/README.md)
* [REPL 交互执行](repl/README.md)
* [Modules 模块](modules/README.md)
* [Addons 扩展](addons/README.md)
* [Appendix - Third Party Modules 附录:第三方模块](appendix_-_third_party_modules/README.md)

60 changes: 60 additions & 0 deletions addons/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
# Addons 扩展
扩展是动态链接的共享对象,可以与C 和C++ 库链合。目前API 是相当复杂,涉及数个库的知识:
* V8 JavaScript, C++ 库。能在C++中与JavaScript 链合:创建对象,调用函数等。文档大部份存放於v8.h 的
标头文件(deps/v8/include/v8.h)。


* libev, C 语言事件循环库。(提供一个能当文档描述符有特定事件发生,或等待时间超过时,执行回调函数
的机制。) 当I/O 执行时, 需要使用libev 。Node 利用EV_DEFAULT 事件循环。文档存放於
http://cvs.schmorp.de/libev/ev.html。

* libeio,C 语言执行绪集区库。能使POSIX 系统异步执行。由於通常已封装於src/file.cc ,所以毋必要
使用。若需使用,查阅标头文件deps/libeio/eio.h。


* 内部Node 库,最主要的是node::ObjectWrap 类,经常用作参考。


* 其他,查阅deps/。


Node 静态编译所有组件成可执行文件。当您编译您的模块时,您不必考虑以上库的连结。
制作一个小型扩展能达到以下效用(C++ 除外):


exports.hello = 'world';
创建文件hello.cc:
```
#include <v8.h>
using namespace v8;
extern "C" void
init (Handle<Object> target)
{
HandleScope scope;
target->Set(String::New("hello"), String::New("World"));
}```

此源文件需要编译成hello.node(二进制扩展)。需要创建一个
python 文件wscript:
```
srcdir = '.'
blddir = 'build'
VERSION = '0.0.1'
def set_options(opt):
opt.tool_options('compiler_cxx')
def configure(conf):
conf.check_tool('compiler_cxx')
conf.check_tool('node_addon')
def build(bld):
obj = bld.new_task_gen('cxx', 'shlib', 'node_addon')
obj.target = 'hello'
obj.source = 'hello.cc'```


执行node-waf configure build 将会创建您的扩展文件至build/default/hello.node。
node-waf 是http://code.google.com/p/waf/[WAF],基於python 的编译系统。node-waf 为使用者提供轻易。
所有Node 扩展必须输出一函数init ,并包含此声明:
extern 'C' void init (Handle<Object> target)


至现时为止,此乃完整的扩展说明文件。请阅http://github.com/ry/node_postgres 以取得真实范例。
46 changes: 46 additions & 0 deletions appendix_-_third_party_modules/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# Appendix - Third Party Modules 附录:第三方模块
目前为止, 已经有很多基于Node 的第三方模块, 模块的代码主仓库地址为
http://github.com/ry/node/wiki/modules[Wiki 页面]


本目录旨在作为一个入门性的向导,帮助刚接触Node 的用户快速查找他们想要的高质量的模块。但是这并不
是一个完整的模块列表,你可能会发现你在其他地方找到的列表会比这儿这更全。


* 模块安装器: [npm](http://github.com/isaacs/npm)


* HTTP 中间件: [Connect](http://github.com/senchalabs/connect)


* Web 框架: [Express](http://github.com/visionmedia/express)

* Web Sockets: [Socket.IO](http://github.com/LearnBoost/Socket.IO-node)

* HTML 解析: [HTML5](http://github.com/aredridel/html5)


* [mDNS/Zeroconf/Bonjour](http://github.com/agnat/node_mdns)

* [RabbitMQ, AMQP](http://github.com/ry/node-amqp)

* [mysql](http://github.com/felixge/node-mysql)

* 序列化: [msgpack](http://github.com/pgriess/node-msgpack)

* 解析器: [Apricot](http://github.com/silentrob/Apricot)


* 调试器: [ndb](http://github.com/smtlaissezfaire/ndb) 是一个命令行界面的调试器;[inspector](http://github.com/dannycoates/node-inspector) 则是一个基于web 的调试工具。


* [pcap binding](http://github.com/mranney/node_pcap)


* [ncurses](http://github.com/mscdex/node-ncurses)

* Testing/TDD/BDD: [vows](http://vowsjs.org/)

* [expresso](http://github.com/visionmedia/expresso)

* [mjsunit.runner](http://github.com/tmpvar/mjsunit.runner)
79 changes: 79 additions & 0 deletions assert/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
# Assert 断言
此模块是用来编写单元测试的,你可以使用require('assert')访问该模块。


**assert.fail(actual, expected, message, operator)**


此函数使用参数operator 测试actual 和expected 是否相等。


**assert.ok(value, [message])**


测试参数value 是否为true,此函数和assert.equal(true, value, message)等价。


**assert.equal(actual, expected, [message])**


此函数为简便测试函数,使用操作符‘==’比较actual 和expected 是否相等。


**assert.notEqual(actual, expected, [message])**


此函数为简便测试函数,使用操作符’!=‘比较actual 和expected 是否相等。


**assert.deepEqual(actual, expected, [message])**


执行深度比较是否相等。
译注:三种比较的不同之处(感谢tytsim):


```
a = {'a':'1','b':'2'};
b = {'b':'2','a':'1'};
equal(a, b) 返回false
deepEqual(a, b) 返回true
strictEqual(a, b) 返回false```

**assert.notDeepEqual(actual, expected, [message])**


深度比较是否不相等。


**assert.strictEqual(actual, expected, [message])**


此函数使用操作符‘===’严格比较是否两参数相等。


**assert.notStrictEqual(actual, expected, [message])**


此函数使用操作符‘!==’严格比较是否两参数不相等。


**assert.throws(block, [error], [message])**


测试代码块,期待其抛出异常。


**assert.doesNotThrow(block, [error], [message])**


测试代码块,期待其不抛出异常。

**assert.ifError(value)**


判断参数value 是否为false,如果为true 则抛出异常。通常用在回调函数中判断是否发生了错误。
译著,实现代码: ```
assert.ifError = function (err) { if (err) {throw err; }};```


1 change: 1 addition & 0 deletions book.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{}
135 changes: 135 additions & 0 deletions buffers/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
# Buffers 缓存对象
纯粹的Javascript 对Unicode 很友好,但是操作二进制数据就不怎么在行了。处理TCP 数据流或者文件时,必
须要操作二进制数据流。node 提供了一些方法来创建、操作和接收二进制数据流。


原始的数据保存在Buffer 类的实例中。Buffer 类似于一个整数数组,不同之处在于它和在V8内存堆之外分配的
一段内存数据相对应。Buffer 对象的大小不能调整。你可以通过"require('buffer').Buffer"来使用这个类。


Buffer 对象是全局对象。


Buffer 和Javascirpt 中string 对象之间的转换需要指定编码方式。如下是node 支持的各种编码方式:


'ascii' - 应用于7位的ASCII 数据。这种编码方式速度很快,它会删除字节的高位。
'utf8' - Unicode 字符。许多网页和其他文档使用UTF-8。
'binary' - 一种只使用每个字符前8个字节将原始的二进制数据编码进字符串的方式。
这个方式已经废弃,应当尽量使用buffer 对象。这个编码将会在未来的node 中删除。


**new Buffer(size)**

创建指定大小的buffer 对象。

**new Buffer(array)**

从数组新建buffer 对象。

**new Buffer(str, encoding='utf8')**

新建一个保存指定字符串的buffer 对象。

**buffer.write(string, offset=0, encoding='utf8')**

使用指定的编码方式将字符串从指定偏移开始写入buffer,然后返回实际写入的大小。如果buffer 空间不足,
则只会写入部分字符串。在本例中使用'utf8'编码,这种方式不会写入半个字符。

示例:将一个utf8字符串写入buffer,然后打印出来

```
buf = new Buffer(256);
len = buf.write('\u00bd + \u00bc = \u00be', 0);
console.log(len + " bytes: " + buf.toString('utf8', 0, len));
// 12 bytes: ½ + ¼ = ¾```

**buffer.toString(encoding, start=0, end=buffer.length)**

解码buffer 数据并使用指定的编码返回字符串,转换从start 参数指定的位置开始,到end 结束。
参看上面buffer.write()的例子。

**buffer[index]**

获取或设置指定的字节。返回值代表一个字节,所以返回值的合法范围是十六进制0x00到0xFF 或者十进制0至
255。


例如:将一个ASCII 字符串复制进buffer,每次一个字节:

```
str = "node.js",
buf = new Buffer(str.length),
i;
for (var i = 0; i < str.length ; i += 1) {
buf[i] = str.charCodeAt(i);
}
console.log(buf);
// node.js```


**Buffer.byteLength(string, encoding='utf8')**

返回字符串的实际字节数。这个函数和String.prototype.length 不同,后者返回字符串的字符数。


```
str = '\u00bd + \u00bc = \u00be';
console.log(str + ": " + str.length + " characters, " +
Buffer.byteLength(str, 'utf8') + " bytes");
// ½ + ¼ = ¾: 9 characters, 12 bytes```

**buffer.length**

buffer 的大小(以字节为单位)。请注意,这个不是存放内容的大小,而是分配给buffer 对象的内存大小。这个
大小不随buffer 中存放内容的多少而改变。

```
buf = new Buffer(1234);
console.log(buf.length);
buf.write("some string", "ascii", 0);
console.log(buf.length);
// 1234
// 1234```


**buffer.copy(targetBuffer, targetStart, sourceStart, sourceEnd=buffer.length)**

在两个buffer 之间执行内存拷贝。

例如:新建两个buffer 对象,然后将buf1中16至19字节拷贝到buf2中第八字节开始的空间中。

```
buf1 = new Buffer(26),
buf2 = new Buffer(26),
i;
for (var i = 0 ; i < 26 ; i += 1) {
buf1[i] = i + 97; // 97 is ASCII a
buf2[i] = 33; // ASCII !
}
buf1.copy(buf2, 8, 16, 20);
console.log(buf2.toString('ascii', 0, 25));```


**buffer.slice(start, end)**

返回和老的buffer 引用同一段内存的新buffer 对象,但是开始和结束的位置由start 和end 参数指定。
修改新的buffer 对象将会改动原来的buffer。

例如:使用字母表建立一个buffer 对象,并剪切出一个新的buffer,然后修改原始buffer 的一个字节。

```
buf1 = new Buffer(26), buf2,
i;
for (var i = 0 ; i < 26 ; i += 1) {
buf1[i] = i + 97; // 97 is ASCII a
}
buf2 = buf1.slice(0, 3);
console.log(buf2.toString('ascii', 0, buf2.length));
buf1[0] = 33;
console.log(buf2.toString('ascii', 0, buf2.length));
// abc
// !bc```



Loading