文档章节

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

共有 人打赏支持
上一篇: nodejs kafka 插件
下一篇: 7天学会nodejs
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
Nest.js 4.6.5 发布,更优雅的下一代 Node.js 开发框架

Nest 是构建高效,可扩展的 Node.js Web 应用程序的框架。 它使用现代的 JavaScript 或 TypeScript(保留与纯 JavaScript 的兼容性),并结合 OOP(面向对象编程),FP(函数式编程)和FRP(...

左华栋
03/03
1K
14

没有更多内容

加载失败,请刷新页面

加载更多

1个开发如何撑起一个过亿用户的小程序

本文由云+社区发表 2018年12月,腾讯相册累计用户量突破1亿,月活1200万,阿拉丁指数排行 Top 30,已经成为小程序生态的重量级玩家。 三个多月来,腾讯相册围绕【在微信分享相册照片】这一核...

腾讯云加社区
11分钟前
1
0
golang ssh包使用方法介绍

在使用gexpect包发现很多问题之外,这里又尝试使用ssh user@127.0.0.1的思路进行用户切换。这里记录下具体的使用方法,遇到的ssh: must specify HostKeyCallback 问题的解法方法及最终使用过...

linuxprobe16
16分钟前
0
0
layer

Layui Layer在open弹出层中异步加载数据和form表单radio、checkbox、select不渲染,不可点击的解决办法 layer 实现弹窗提交信息 function confirmUpdateAward(i) { layer.open({ ...

mickelfeng
今天
1
0
Spring boot中如何获取profiles环境

  实现ApplicationContextAware @Componentpublic class QiNiuPropertiesConfig implements ApplicationContextAware { /// 获取当前环境public String getActiveProfile() { ret......

writeademo
今天
4
0
机器学习中的End-to-End到底是怎么回事?

简单讲就是,Input--->系统(这里指神经网络)--->Output(直接给出输入,NN神经网络就给出结果,一气喝成!!!) 借用一段对话:(http://dy.163.com/v2/article/detail/C3J6F2NJ0511AQHO....

火力全開
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部