您正在查看: Node.js 分类下的文章

The NodeJS net.Stream TCP流模块

net.Stream TCP流模块

这个对象是对TCP 或者UNIX SOCKET 的抽象,它实现了全双工的流接口。net.Stream 可以由用户手动建立,
并且作为一个客户端来使用(和connect()),也可以被node 建立并通过服务器的'connection'事件传递给用户。(译
注:如http.Server 的connection 事件,会将net.Stream 的实例当作参数传递给响应函数)
net.Stream 实例会发出下列事件:

Event: 'connect'

function () { }```

当成功建立连接后触发此事件事件。详见connect()。


**Event: 'secure'**

function () { }```

当一个stream 与其对等端安全建立一个SSL 握手后触发。

Event: 'data'

function (data) { }```

当接收到数据时触发该事件,数据会是Buffer 或者String,数据的编码通过stream.setEncoding()来设计(查看可
读流那部分文章来获得更多信息)。


**Event: 'end'**

function () { }```

当stream 发出一个FIN 包后触发此事件。这个事件发出后准备状态会变为‘只写’(writeOnly)。当这个事件被发出
后,唯一能做的事情或许只是call stream.end()了。

Event: 'timeout'

function () { }```

当流因为不活动而超时时触发这个事件。这是唯一一个因为stream 空闲而通知的事件,这个时候用户必须手动
关闭这个连接。
参见:stream.setTimeout()


**Event: 'drain'**

function () { }```

当写缓冲区变空的时候触发这个事件,这个事件可以用来控制/调节上传。

Event: 'error'
function (exception) { }
当发生一个错误时候触发。‘close’事件将跟随这个事件被发出。
Event: 'close'

function (had_error) { }```

当stream 被完全关闭时发出这个事件。参数had_error 是一个用来标示stream 关闭是否是因为传输错误所导致
的标志。


net.createConnection(port, host='127.0.0.1')```

构造一个新的stream 对象并且打开一个stream 到指定的端口和主机,如果第二个参数没有写,则假设主机为
localhost

建立连接后触发connect 事件。

stream.connect(port, host='127.0.0.1')

在指定端口和主机打开一个stream。createConnection()也可以建立连接,所以通常我们并不需要使用这个方法。
只有在一个stream 被关闭,并且你希望重新使用这个对象连接到其他主机的时候我们才用这个方法。

这个函数是异步的。在连接建立之后会触发‘connect’事件。如果在连接过程中产生问题,将产生'error'事件,而
不会被触发'connect'。

stream.remoteAddress

这个字符串代表远程计算机的IP 地址,例如'74.125.127.100' 或者'2001:4860:a005::68'。
这个成员变量只存在于服务器端连接。

stream.readyState

stream.readyState 可以是'closed', 'open', 'opening', 'readOnly' 'writeOnly' 中的一个。

stream.setEncoding(encoding='null')

为接受到的数据设置编码格式(只能'ascii', 'utf8', 'base64'中的一个)。

stream.setSecure([credentials])

配合crypto 模块提供的私钥和证书(在peer authentication 中是CA 证书),此方法可以为stream 提供https 支持。

如果credentials 包含一个或多个数字认证中心证书(CA certificates),则stream 将请求对等待方提交一个客户端
证书作为HTTPS 连接握手的一部分,证书的合法性及内容可以通过verifyPeer()及getPeerCertificate 来查看。

stream.verifyPeer()

根据被信任的证书列表或对方连接证书上下文的验证结果返回true 或false。

stream.getPeerCertificate()

返回用JSON 结构详尽表述的对等方证书,其中包含一个证书的‘主题’,‘发布者’,'有效来源','有效目标'。

stream.write(data, encoding='ascii')

通过stream 发送数据,第二个参数指定这个字符串实例的编码,缺省为ASCII,因为实用UTF8编码比较慢。

如果全部数据安全写入内核缓冲区则返回true,如果全部或者部分数据仍然在用户空间排队则返回false, 当缓
冲区再次空闲的时候'drain'事件会被触发。

stream.end([data], [encoding])
半关闭stream,也就是说,steram 发出一个FIN 包。这个时候可能服务器还会发出一些数据。当call 这个函数
后,readyState 会变成'readOnly'。
如果使用了data 这个参数, 这就相当于call stream.write(data, encoding), 其次后面跟随着
stream.end().stream.destroy()
请确保在这个stream 上没有任何I/O 活动。只有在错误发生的时候(为了调试错误)才需要调用此函数。

stream.pause()

暂停数据的读取.更确切的说,'data'事件将不会被发出,这个方法在控制上传的时候非常有用。

stream.resume()

当恢复读取数据。

stream.setTimeout(timeout)

设置timeout 这么多毫秒作为stream 的超时时间,默认情况下net.Stream 没有超时时间。
当超时事件被触发,stream 将受到一个‘timeout’事件,但是连接将不会被断掉,用户必须执行end()或者destroy
来结束这个stream。

如果timeout 为0,会禁用超时。

stream.setNoDelay(noDelay=true)

禁止Nagle algorithm(Nagle 运算模式被设计用来减少LAN 和其它网络拥塞),缺省情况下TCP 连接使用Nagle
algorithm,此模式会在真正将数据发出前将其缓冲起来。设置noDelay 将在每次call stream.write()时立刻将数据
连续发出。

stream.setKeepAlive(enable=false, [initialDelay])

允许/禁止keep-alive 功能,在一个空闲stream 首次收到keepalive 之前可以设置killalive 的延时。设置
initialDelay(毫秒)变量将设置接收到最后的数据包和首次keepalive 探测之间的时差。设置为0则保持缺省(或者
上一次的)设置的数值不变。

The NodeJS Path模块

Path模块

此模块包含很多用于处理文件路径的小工具。你可以通过require('path')使用该模块。它提供了如下函数:

path.join([path1], [path2], [...])

将所有参数连接在一起并解析生成新的路径。
示例:

node> require('path').join(
... '/foo', 'bar', 'baz/asdf', 'quux', '..')
'/foo/bar/baz/asdf'```

**path.normalizeArray(arr)**


转化路径的各部分,将'..'和'.'替换为实际的路径。
示例:


path.normalizeArray([,
'foo', 'bar', 'baz', 'asdf', 'quux', '..'])
// returns
[ , 'foo', 'bar', 'baz', 'asdf' ]```

path.normalize(p)

转化路径字符串,将'..'和'.'替换为实际的路径。
示例:

path.normalize('/foo/bar/baz/asdf/quux/..')
// returns
'/foo/bar/baz/asdf'```

**path.dirname(p)**


返回路径中代表文件夹的部分,同Unix 的dirname 命令类似。
示例:

path.dirname('/foo/bar/baz/asdf/quux')
// returns
'/foo/bar/baz/asdf'```

path.basename(p, [ext])

返回路径中的最后一部分。同Unix 命令bashname 类似。
示例“

path.basename('/foo/bar/baz/asdf/quux.html')
// returns
'quux.html'
path.basename('/foo/bar/baz/asdf/quux.html', '.html')
// returns
'quux'```

**path.extname(p)**


返回路径中文件的后缀名,即路径中最后一个'.'之后的部分。如果一个路径中并不包含'.'或该路径只包含一个'.'
且这个'.'为路径的第一个字符,则此命令返回空字符串。如下所示:


path.extname('index.html')
// returns
'.html'
path.extname('index')
// returns```

path.exists(p, [callback])

检测给定的文件路径是否存在。然后传递结果(true 或false)给回调函数。

path.exists('/etc/passwd', function (exists) {
sys.debug(exists ? "it's there" : "no passwd!");
});```

The NodeJS process 进程

process 进程

process 对象是一个全局对象,可以在任何地方访问。它也是一个EventEmitter 的实例。

Event: 'exit'

function () {}```


此事件在进程退出时被触发。这是一个检查模块状态的好地方(例如,做单元测试)。由于主事件循环在'exit'
返回方法之后将不会继续执行,所以计时器(timers)可能不会生效。


示例,监听exit 事件:


process.on('exit', function () {
process.nextTick(function () {
console.log('This will not run');
});
console.log('About to exit.');
});```

Event: 'uncaughtException'

function (err) { }```


发生未处理的异常时,此事件会被触发。如果该事件有监听函数,则不执行默认行为(默认行为将打印错误堆
栈并结束应用程序的执行)。
示例,监听'uncaughtException'事件:

process.on('uncaughtException', function (err) {
console.log('Caught exception: ' + err);
});
setTimeout(function () {
console.log('This will still run.');
}, 500);
// Intentionally cause an exception, but don't catch it.
nonexistentFunc();
console.log('This will not run.');```

注意,uncaughtException
事件是一种非常原始的异常处理机制。你可以在程序中使用try/cache 来获得对程序流
的更多控制权。特别是对于要长时间执行的服务器端程序,uncaughtException 事件是个很有用的安全机制。

Signal Events

function () {}```

当进程接收到信号时被触发。要查看如SIGINT 或SIGUSR1之类的标准POSIX 信号列表,请参看参看
sigaction(2)。


监听SIGINT 信号的示例:


var stdin = process.openStdin();
process.on('SIGINT', function () {
console.log('Got SIGINT. Press Control-D to exit.');
});```

发送SIGIINT 信号最简单的方法是使用Control-C,大多数情况下这会终止应用程序的执行。

process.stdout

一个代表标准输出的流对象。

示例:console.log 的定义

console.log = function (d) {
process.stdout.write(d + '\n');
};```


**process.openStdin()**


打开标准输入流,返回一个只读流对象。
打开标准输入并同时监听两个事件的示例:

var stdin = process.openStdin();
stdin.setEncoding('utf8');
stdin.on('data', function (chunk) {
process.stdout.write('data: ' + chunk);
});
stdin.on('end', function () {
process.stdout.write('end');
});```

process.argv

保存命令行参数的数组。第一个参数是"node",第二个参数是javascript 文件的文件名,接下来是附加的命令
行参数。

// print process.argv
process.argv.forEach(function (val, index, array) {
console.log(index + ': ' + val);
});```

上述代码将产生如下输出:

$ node process-2.js one two=three four
0: node
1: /Users/mjr/work/node/process-2.js
2: one
3: two=three
4: four```

process.execPath

此参数为进程可执行文件的绝对路径。

例如:

/usr/local/bin/node```

**process.chdir(directory)**


改变进程的当前目录,失败时抛出异常。


console.log('Starting directory: ' + process.cwd());
try {
process.chdir('/tmp');
console.log('New directory: ' + process.cwd());
}
catch (err) {
console.log('chdir: ' + err);
}```

process.compile(code, filename)

同evel 方法相同,但是你可以指定文件名,这样可以更好的输出错误信息,并且运行的代码(指通过code 参数
传递的代码)无法访问本地作用域。如果编译的代码产生堆栈输出,filename 参数将会被用作这段代码的文件名。
示例,使用process.compile 和eval 执行同一段代码:

var localVar = 123,
compiled, evaled;
compiled = process.compile('localVar = 1;', 'myfile.js');
console.log('localVar: ' + localVar + ', compiled: ' + compiled);
evaled = eval('localVar = 1;');
console.log('localVar: ' + localVar + ', evaled: ' + evaled);
// localVar: 123, compiled: 1
// localVar: 1, evaled: 1```

process.compile 并没有访问本地作用域,所以localVar 变量并没有改变。eval 可以访问本地作用域,所以localVar
被改变了。


当代码中有语法错误时,process.compile 将会是应用程序退出。


参见:脚本(Script)章节


**process.cwd()**


返回进程的当前工作目录。


console.log('Current directory: ' + process.cwd());```

process.env

一个保存用户环境变量的对象。参看environ(7)。

process.exit(code=0)

使用进程退出代码(main 函数的返回值)并退出进程。如果不指定参数,exit 将使用表示成功的代码0。
示例,退出程序,并返回错误状态。

process.exit(1);

执行node 的shell 将会得到返回值1。

process.getgid()

返回进程的用户组标识。(参见getgid(2).)这个是数字形式的组ID,并非组名。

console.log('Current gid: ' + process.getgid());```

**process.setgid(id)**


当前进程的用户组标识。(参见setgid(2).)这个函数可以接受数字形式的组ID 或者是字符串形式的组名。如果
指定组名,此函数会阻塞进程直至将组名解析成为数字ID。

console.log('Current gid: ' + process.getgid());
try {
process.setgid(501);
console.log('New gid: ' + process.getgid());
}
catch (err) {
console.log('Failed to set gid: ' + err);
}```
process.getuid()

返回当前进程的用户标识。(参看getuid(2).)此函数返回数字形式的用户ID,而不是用户名。

console.log('Current uid: ' + process.getuid());```

**process.setuid(id)**


指定当前进程的用户标识。(参看setuid(2).)这个函数可以接受数字形式的用户ID 或者字符串形式的用户名。
如果指定用户名,此方法在将用户名解析成用户ID 时会阻塞。

console.log('Current uid: ' + process.getuid());
try {
process.setuid(501);
console.log('New uid: ' + process.getuid());
}
catch (err) {
console.log('Failed to set uid: ' + err);
}```

process.version

编译进可执行文件的属性,代表NODE_VERSION。

console.log('Version: ' + process.version);```

**process.installPrefix**


编译进可执行文件的属性,代表NODE_PREFIX。

console.log('Prefix: ' + process.installPrefix);```

process.kill(pid, signal='SIGINT')

向一个进程发送信号,参数pid 为进程ID,signal 是一个描述要发送信号的字符串,如‘SIGINT’或者‘SIGUSR1’。
如果不指定,默认发送'SIGINT'信号。更多信息请参看kill(2)。

请注意,虽然此函数名为process.kill,但是它仅仅用于发送信号,就像kill 系统调用。发送的信号做除了结束
目标进程外,还可能做其他的事情。
发送信号的示例:

process.on('SIGHUP', function () {
console.log('Got SIGHUP signal.');
});
setTimeout(function () {
console.log('Exiting.');
process.exit(0);
}, 100);
process.kill(process.pid, 'SIGHUP');```

**process.pid**


当前进程的ID

console.log('This process is pid ' + process.pid);```

process.title

设置、获取ps 命令中显示的名称。

process.platform

表示程序运行的平台,如'linux2','darwin'等。

console.log('This platform is ' + process.platform);```

**process.memoryUsage()**


返回一个描述Node 进程内存占用的对象。


var sys = require('sys');
console.log(sys.inspect(process.memoryUsage()));```

如上代码将输出:

, vsize: 41893888
, heapTotal: 1826816
, heapUsed: 650472
}

heapTotal 和heapUsed 表示V8占用的内存。

process.nextTick(callback)

在事件循环的下一轮调用这个回调。此函数不是setTimeout(fn, 0)的别名,它更加高效。

process.nextTick(function () {
console.log('nextTick callback');
});

process.umask([mask])

设置或读取进程的文件创建模式掩码,子进程会从父进程继承这个掩码。如果使用此函数设置新的掩码,则它
返回旧的掩码,否则返回当前掩码。

var oldmask, newmask = 0644;
oldmask = process.umask(newmask);
console.log('Changed umask from: ' +                 oldmask.toString(8) +
        ' to ' + newmask.toString(8));

The NodeJS Query String 查询字串

Query String 查询字串

此模块能处理查询字串(query strings),提供以下方法:

querystring.stringify(obj, sep='&', eq='=', munge=true)

序列化对象至查询字串。选择性地覆写默认分割符和增补字符(assignment characters)。
例子:

querystring.stringify({foo: 'bar'})
// returns
'foo=bar'
querystring.stringify({foo: 'bar', baz: 'bob'}, ';', ':')
// returns
'foo:bar;baz:bob'```

此方法默认由阵列和对象(obj)排列成php/Rails 风格的查询字串,例子:


querystring.stringify({foo: ['bar', 'baz', 'boz']})
// returns
'foo%5B%5D=bar&foo%5B%5D=baz&foo%5B%5D=boz'
querystring.stringify({foo: {bar: 'baz'}})
// returns
'foo%5Bbar%5D=baz'```

若希望停用字元解析(例如当生成参数予Java servlet 时),可以设置munge(字元解析) 参数成false(假值),例
子:

querystring.stringify({foo: ['bar', 'baz', 'boz']}, '&', '=', false)
// returns
'foo=bar&foo=baz&foo=boz'```

注意当munge(字元解析) 为false 时,参数名称仍会被解析。

**querystring.parse(str, sep='&', eq='=')**


反序列化查询字串至对象。选择性地覆写默认分割符和增补字符
(assignment characters)。

querystring.parse('a=b&b=c')
// returns
{ 'a': 'b'
, 'b': 'c'
}```

这方法可以解析已解析和未解析的查询字串。

querystring.escape

querystring.stringify 中所使用的escape 方法。您可以覆写它。

querystring.unescape

querystring.parse 中所使用的unescape 方法。您可以覆写它。

The NodeJS http.ServerRequest

http.ServerRequest

这个对象通常由HTTP SERVER 建立而非用户手动建立,并且会作为传递给'request'事件监听器第一个参数
此对象的可以触发以下事件:

Event: 'data'

function (chunk) { }```

当接收到信息体中的一部分时候会发出data 事件。
例如:代表消息体的数据块将作为唯一的参数传递给回调函数。这个时候数据已经按照传输编码进行了解码(不
是字符集编码)。消息体本身是一个字符串,可以使用request.setBodyEncoding()方法设定消息体的编码。


**Event: 'end'**

function () { }```

每次完全接收完信息后都会触发一次。没有参数,当这个事件发出后,将不会再触发其他事件。

request.method

request.method 是一个只读字符串。例如'GET','DELETE'

request.url

代表所请求的URL 字符串.他仅包括实际的HTTP 请求中的URL 地址。如果这个请求是

GET /status?name=ryan HTTP/1.1\r\n
Accept: text/plain\r\n
\r\n```

则request.url 应当是


    '/status?name=ryan'


如果你想要解析这个URL
中的各个部分,你应当使用require('url').parse(request.url).
Example:


node> require('url').parse('/status?name=ryan')
{ href: '/status?name=ryan'
, search: '?name=ryan'
, query: 'name=ryan'
, pathname: '/status'
}

如果你想从查询字符串中提出这些参数,你可以使用require('querystring').parse 方法,或者传一个true 作为第二个
参数给require('url').parse 方法。
Example:

node> require('url').parse('/status?name=ryan', true)
{ href: '/status?name=ryan'
, search: '?name=ryan'
, query: { name: 'ryan' }
, pathname: '/status'
}```

request.headers

只读

request.httpVersion

这是HTTP 协议版本( 字符串形式) , 只读。例如'1.1','1.0' 。request.httpVersionMajor 是第一个数字,
request.httpVersionMinor 是第二个数字。

request.setEncoding(encoding='null')

设置此请求的包体的字集编码,'utf8'或者'binary'。缺省值是null,这表示'data'事件的参数将会是一个Buffer 对象。

request.pause()

暂停此request 触发事件.对于控制上传非常有用。

request.resume()

恢复一个暂停的request。

request.connection

request.connection 是一个代表当前连接的net.Stream 对象。
对于HTTPS,使用request.connection.verifyPeer() 和request.connection.getPeerCertificate()来获得客户端(浏览
器)的认证详情。