文档章节

nodejs核心编程笔记

a
 allantaylor81
发布于 2015/03/25 10:27
字数 2097
阅读 98
收藏 9

一、全局对象和全局变量

全局对象: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

本文转载自:http://my.oschina.net/imhoodoo/blog/361937

共有 人打赏支持
a
粉丝 2
博文 120
码字总数 2912
作品 0
东城
效率至上的nodejs 手动实现服务器

这是一个连续的node学习笔记, 本文是第一章, 会持续更新, 持续完善 python好用,用久了就会把人的脾气养起来, nodejs不好用, 但效率很好, 也能彻底治好你的坏脾气 nodejs的回调是我用过的最蛋...

木子昭
08/20
0
0
一点感悟:《Node.js学习笔记》star数突破1000+

写作背景 笔者前年开始撰写的《Node.js学习笔记》 github star 数突破了1000,算是个里程碑吧。 从第一次提交(2016.11.03)到现在,1年半过去了。突然有些感慨,想要写点东西,谈谈这期间的...

程序猿小卡_casper
06/06
0
0
NODE高级编程阅读笔记系列(一)

本篇涉及以下主题 node简单介绍 事件驱动编程 模块化 缓冲区处理 Node简单介绍 直接用官方的那句话: Node.js 是一种建立在Google Chrome's V8 引擎上的non-blocking(非阻塞),event-driven(...

可爱的圣诞老人
05/23
0
0
细谈Node.js----我的笔记

学习心得 如何利用Javascript做为服务端脚本,通过Nodejs框架web开发。Nodejs框架是基于V8的引擎,是目前速度最快的 Javascript引擎。chrome浏览器就基于V8,同时打开20-30个网页都很流畅。N...

crossmix
2016/01/04
221
0
《Node.js开发指南》书评汇总

刚查了下库存,发现订阅《Node.js开发指南》的读者大增,这是为什么呢?看了下近期本书在豆瓣的评论,口碑很好,现将豆瓣的书评汇总如下: ----------------------------------------------...

生气的散人
2012/10/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

20180920 rzsz传输文件、用户和用户组相关配置文件与管理

利用rz、sz实现Linux与Windows互传文件 [root@centos01 ~]# yum install -y lrzsz # 安装工具sz test.txt # 弹出对话框,传递到选择的路径下rz # 回车后,会从对话框中选择对应的文件传递...

野雪球
今天
2
0
OSChina 周四乱弹 —— 毒蛇当辣条

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ 达尔文:分享花澤香菜/前野智昭/小野大輔/井上喜久子的单曲《ミッション! 健?康?第?イチ》 《ミッション! 健?康?第?イチ》- 花澤香菜/前野智...

小小编辑
今天
7
3
java -jar运行内存设置

java -Xms64m #JVM启动时的初始堆大小 -Xmx128m #最大堆大小 -Xmn64m #年轻代的大小,其余的空间是老年代 -XX:MaxMetaspaceSize=128m # -XX:CompressedClassSpaceSize=6...

李玉长
今天
4
0
Spring | 手把手教你SSM最优雅的整合方式

HEY 本节主要内容为:基于Spring从0到1搭建一个web工程,适合初学者,Java初级开发者。欢迎与我交流。 MODULE 新建一个Maven工程。 不论你是什么工具,选这个就可以了,然后next,直至finis...

冯文议
今天
2
0
RxJS的另外四种实现方式(四)——性能最高的库(续)

接上一篇RxJS的另外四种实现方式(三)——性能最高的库 上一篇文章我展示了这个最高性能库的实现方法。下面我介绍一下这个性能提升的秘密。 首先,为了弄清楚Most库究竟为何如此快,我必须借...

一个灰
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部