nodejs核心编程笔记

一、全局对象和全局变量

全局对象:global

global最根本的左营是作为全局变量的宿主。按照ECMAScript的定义,

满足以下条件的变量是全局变量。

1、在最外层定义的变量

2、全局对象的属性

3、隐式定义的变量(未定义直接赋值的变量)

当你定义一个全局变量时,这个变量同时也会成为全局对象的属性,反之亦然。

需要注意的是,在node中你不可能在最外层定义变量,因为所有用户代码都是

属于当前模块的,而模块本事不是最外层的上下文。

注意:

永远使用var定义变量以避免引入全局变量,因为全局变量会污染命名空间,提高代码的耦合风险。

全局变量process 描述当前进程状态,提供一个与操作系统的简单接口。

process.argv是命令行参数数组,第一个元素是node,第二个元素是脚本文件名

从第三个元素开始每个元素是一个运行参数。

技术分享

执行结果

技术分享

技术分享

提供标准输入输出流。

技术分享

执行结果

技术分享

process.nextTick(callback)的功能是为事件循环设置一项任务,
node会在下次事件循环调用响应的时候调用callback

why?

node适合I/O密集型的应用,而不是计算密集型的应用,

因为一个你的进程只有一个线程

因此在任何时刻都只有一个事件在执行,如果这个事件占用大量的cpu时间,

执行时间循环中的下一个时间就需要等待很久,因此node的一个编程原则

就是尽量缩短每个事件的执行时间,process.nextTick()提供了一个这样的

工具,可以把复杂的工作拆散,变成一个个较小的事件。

技术分享

执行结果很显然不是同步执行调用的

技术分享

是在下一个事件循环响应时调用的

console也是全局变量 用于提供控制台标准输出的。

console.log()向标准输出流打印字符并以换行符结束。。console.log 接受若干

个参数,如果只有一个参数,则输出这个参数的字符串形式。如果有多个参数,则

以类似于 C 语言 printf() 命令的格式输出。第一个参数是一个字符串,如果没有

参数,只打印一个换行。

技术分享

运行结果为:

技术分享

console.error()与console.log()用法相同,只是向标准错误流输出。

console.trace():向标准错误流输出当前的调用栈

技术分享

技术分享

二、常用工具util

util是一个核心模块,提供常用函数的集合,用于弥补核心Javascript的功能过于精简的不足。

1、对象继承

util.inherits(son,//util.inherits(constructor,superconstructor);

技术分享

测试结果

技术分享

Son仅仅使用util中的函数就完成了从圆原型集成属性和方法。

2、将任意对象转换为字符串util.inspect()

技术分享

结果为

技术分享

3、其他

还有四个类型测试工具以及格式化和debug工具

util.isArray();判断是不是数组

util.isRegExp();判断正则

util.isDate();判断时间

util.isError();判断是否是错误

技术分享

结果

技术分享

util.format();

技术分享

结果

技术分享

三、事件处理

1、普通事件处理 绑定 移除等

events模块中的events.EventEmitter是时事件发射和事件监听器功能的封装。

技术分享

带参数的事件。

技术分享

结果

技术分享

EventEmitter.once()只绑定执行一次,注册单次监听器,最多触发一次

技术分享

结果

技术分享

移除事件监听EventEmitter.removeListener(event,listener);移除指定事件的某个监听器

其中listener必须是该时间已经注册过的监听器

正常情况下这么写

技术分享

结果是

技术分享

如果加上移除事件监听的代码。

技术分享

结果是

技术分享

没有ok5事件执行的消息。说明注册的监听器已经成功移除了。

如果绑定了多个监听器想同时移除的话 使用

EventEmitter.removeAllListeners([event]);

技术分享

结果

技术分享

显示一个事件都没有执行,说明删除了所有的监听器。

2、error事件

Eventemitter定义了一个特殊事件 error

当error事件发射的时候,如果没有响应的监听器 node会把它当做一场,

退出程序并打印调用栈,一般要为会发射error事件的对象设置监听器,避免

遇到错误后整个程序崩溃掉。

技术分享

结果

技术分享

如果添加处理函数。

技术分享

结果

技术分享

大多数时候我们不会直接使用EventEmitter,而是在对象中继承它,包括fs、net、http在内的

只要是支持事件响应的核心模块都是EventEmitter的子类。

why?

首先,具有某个实体功能的对象实现事件符合语义,事件的监听和发射应该是一个对象的方法。

其次,Javascript的对象机制是基于原型的,支持部分多重继承,继承Eventemitter不会打乱

对象原有的继承关系。

四、文件系统fs(file system)

fs模块是文件操作的封装,它提供了文件的读取、写入、更名、删除、遍历目录、链接等POSIX

文件系统的操作。

不同之处:

fs模块中所有操作都是提供了异步和同步的两个版本,例如读取文件内容的函数有异步的

fs.readFile()h和同步的fs.readFileSync()。

1、异步读取文件 fs.readFile(文件名,编码,回调函数(error,data))

最简单的读取文件的函数。

文件名:必填

编码:表示文件的字符编码,指定了解析后是字符串,否则将会以Buffer形式表示二进制数据

回调函数:error表示有没有错误发生,data是读取到的文件内容

技术分享

结果是

技术分享

2、同步读取文件:

技术分享

结果

技术分享

同步读文件如果出现异常需要try catch捕获异常

技术分享

结果

技术分享

3、文件打开fs.open(文件名,打开模式,权限,回调)

fs.open(path, flags, [mode], [callback(err, fd)])是 POSIX open 函数的

封装,与 C 语言标准库中的 fopen 函数类似。它接受两个必选参数,path 为文件的路径,

flags 可以是以下值。 

? r :以读取模式打开文件。 

? r+ :以读写模式打开文件。 

? w :以写入模式打开文件,如果文件不存在则创建。 

? w+ :以读写模式打开文件,如果文件不存在则创建。 

? a :以追加模式打开文件,如果文件不存在则创建。 

? a+ :以读取追加模式打开文件,如果文件不存在则创建。 

mode 参数用于创建文件时给文件指定权限,默认是 0666

①。回调函数将会传递一个文

件描述符 fd

4、文件读取

fs.read(fd, buffer, offset, length, position, [callback(err, bytesRead, 

buffer)])是 POSIX read 函数的封装, 相比 fs.readFile 提供了更底层的接口。 fs.read 

的功能是从指定的文件描述符 fd 中读取数据并写入 buffer 指向的缓冲区对象。 offset 是 

buffer 的写入偏移量。length 是要从文件中读取的字节数。position 是文件读取的起始

位置,如果 position 的值为 null,则会从当前文件指针的位置读取。回调函数传递 

bytesRead 和 buffer,分别表示读取的字节数和缓冲区对象。

以下是一个使用 fs.open 和 fs.read 的示例。 

var fs = require(‘fs‘); 

 

fs.open(‘content.txt‘, ‘r‘, function(err, fd) { 

  if (err) { 

    console.error(err); 

    return; 

  } 

   

  var buf = new Buffer(8); 

  fs.read(fd, buf, 0, 8, null, function(err, bytesRead, buffer) { 

    if (err) { 

      console.error(err); 

      return; 

    } 

     

    console.log(‘bytesRead: ‘ + bytesRead); 

    console.log(buffer); 

  }) 

}); 

运行结果则是: 

bytesRead: 8 

<Buffer 54 65 78 74 20 e6 96 87> 

一般来说,除非必要,否则不要使用这种方式读取文件,因为它要求你手动管理缓冲区

和文件指针,尤其是在你不知道文件大小的时候,这将会是一件很麻烦的事情。 

5、http服务器

技术分享

http.createServer 创建了一个 http.Server 的实例,将一个函数

作为 HTTP 请求处理函数。这个函数接受两个参数,分别是请求对象( req )和响应对象

( res ) 。在函数体内,res 显式地写回了响应代码 200 (表示请求成功) ,指定响应头为 

‘Content-Type‘: ‘text/html‘,然后写入响应体 ‘<h1>Node.js</h1>‘,通过 res.end 

结束并发送。最后该实例还调用了 listen 函数,启动服务器并监听 3000 端口

GET POST

技术分享

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。