Nodejs入门(一)

1: 创建nodejs第一个应用
touch server.js
nodejs server.js
curl 127.0.0.1:8888 即可得到hello world!

2:npm使用(类似Python pip模块安装工具)
npm安装完成,即可用npm install xxx; 安装对应的nodejs模块
模块安装好之后,xxxx包就放在了工程目录下的 node_modules 目录中,因此在代码中只需要通过 require('xxxxx') 的方式就好,无需指定第三方包路径。
npm模块安装包含本地安装和全局安装概念; 在安装命令npm install xxxx -g 即可实现全局安装
本地安装:
将安装包放在 ./node_modules 下(运行 npm 命令时所在的目录),如果没有 node_modules 目录,会在当前执行 npm 命令的目录下生成 node_modules 目录。
可以通过 require() 来引入本地安装的包
全局安装:
将安装包放在 /usr/local 下

npm list -g:查看全局安装模块
npm list xxxx 查看xxxx模块版本
npm uninstall xxxx 卸载对应模块
npm ls 查看包是否存在
npm update xxxx 更新模块
npm search xxxx 搜索模块
创建模块:npm init生成json文件,之后可以采用npm push来发布你的包;后续研究细节

npm常用命令:
npm help: 查看某条命令详细使用信息
package.json所在目录下使用 npm install . -g可先在本地安装当前命令行程序,可用于发布前的本地测试
npm update <package>可以把当前目录下 node_modules子目录里边的对应模块更新至最新版本
npm update <package> -g可以把全局安装的对应命令行程序更新至最新版
npm cache clear可以清空NPM本地缓存,用于对付使用相同版本号发布新版本代码的人
npm unpublish <package>@<version>可以撤销发布自己发布过的某个版本代码
使用淘宝NPM
npm install -g cnpm --registry= https://registry.npm.taobao.org
cnpm install [name]

3:nodejs 交互式解释器
ctrl + c - 退出当前终端
ctrl + c 按下两次 - 退出 Node REPL
ctrl + d - 退出 Node REPL
向上/向下 键 - 查看输入的历史命令
tab 键 - 列出当前命令
.help - 列出使用命令
.break - 退出多行表达式
.clear - 退出多行表达式
.save filename - 保存当前的 Node REPL 会话到指定文件
.load filename - 载入当前 Node REPL 会话的文件内容

3:Nodejs回调函数(异步编程体现)
阻塞代码:

非阻塞代码执行结果:


4:nodejs事件驱动
在nodejs事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。
Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件;
实例:


EventEmitter类:
addListener(event, listener): 为指定事件添加一个监听器到监听器数组的尾部
on(event, listener): 为指定事件注册一个监听器,接受一个字符串 event 和一个回调函数。
server.on('connection', function (stream) { console.log('someone connected!');});
once(event, listener):为指定事件注册一个单次监听器,即 监听器最多只会触发一次,触发后立刻解除该监听器。
removeListener(event, listener):移除指定事件的某个监听器,监听器必须是该事件已经注册过的监听器。它接受两个参数,第一个是事件名称,第二个是回调函数名称。
var callback = function(stream) { console.log('someone connected!');};server.on('connection', callback);// ...server.removeListener('connection', callback);
removeAllListeners([event]):移除所有事件的所有监听器, 如果指定事件,则移除指定事件的所有监听器。
setMaxListeners(n):默认情况下, EventEmitters 如果你添加的监听器超过 10 个就会输出警告信息。 setMaxListeners 函数用于提高监听器的默认限制的数量。
listeners(event):返回指定事件的监听器数组。
emit(event, [arg1], [arg2], [...]):按参数的顺序执行每个监听器,如果事件有注册监听返回 true,否则返回 false。

注意:eventEmitter.on()与eventEmitter.addListener()没有区别,且一个事件可以绑定多个回调函数

EventEmitter类实例:


5:nodejs缓冲区
JavaScript 语言自身只有字符串数据类型,没有二进制数据类型。但在处理像TCP流或文件流时,必须使用到二进制数据。因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门存放二进制数据的缓存区。
Buffer和字符编码
const buf = Buffer.from('runoob', 'ascii');
console.log(buf.toString('hex'));
console.log(buf.toString('base64'));

nodejs目前支持字符编码:
ascii - 仅支持 7 位 ASCII 数据。如果设置去掉高位的话,这种编码是非常快的。
utf8 - 多字节编码的 Unicode 字符。许多网页和其他文档格式都使用 UTF-8
utf16le - 2 或 4 个字节,小字节序编码的 Unicode 字符。支持代理对(U+10000 至 U+10FFFF)
ucs2 - utf16le 的别名
base64 - Base64 编码
latin1 - 一种把 Buffer 编码成一字节编码的字符串的方式
binary - latin1 的别名
hex - 将每个字节编码为两个十六进制字符

创建buffer类:
Buffer.alloc(size[, fill[, encoding]]): 返回一个指定大小的 Buffer 实例,如果没有设置 fill,则默认填满 0
Buffer.allocUnsafe(size): 返回一个指定大小的 Buffer 实例,但是它不会被初始化,所以它可能包含敏感的数据
Buffer.allocUnsafeSlow(size)
Buffer.from(array): 返回一个被 array 的值初始化的新的 Buffer 实例(传入的 array 的元素只能是数字,不然就会自动被 0 覆盖)
Buffer.from(arrayBuffer[, byteOffset[, length]]): 返回一个新建的与给定的 ArrayBuffer 共享同一内存的 Buffer
Buffer.from(buffer): 复制传入的 Buffer 实例的数据,并返回一个新的 Buffer 实例
Buffer.from(string[, encoding])

// 创建一个长度为 10、且用 0 填充的 Buffer
const buf1 = Buffer.alloc(10);
// 创建一个长度为 10、且用 0x1 填充的 Buffer
const buf2 = Buffer.alloc(10, 1);
// 创建一个长度为 10、且未初始化的 Buffer// 这个方法比调用 Buffer.alloc() 更快,// 但返回的 Buffer 实例可能包含旧数据,// 因此需要使用 fill() 或 write() 重写
const buf3 = Buffer.allocUnsafe(10);
// 创建一个包含 [0x1, 0x2, 0x3] 的 Buffer
const buf4 = Buffer.from([1, 2, 3])
// 创建一个包含 UTF-8 字节 [0x74, 0xc3, 0xa9, 0x73, 0x74] 的 Buffer
const buf5 = Buffer.from('tést');
// 创建一个包含 Latin-1 字节 [0x74, 0xe9, 0x73, 0x74] 的 Buffer
const buf6 = Buffer.from('tést', 'latin1');

写入Buffer:
语法:buf.write(string[, offset[, length]][, encoding])
参数描述: string - 写入缓冲区的字符串
offset - 缓冲区开始写入的索引值,默认为 0
length - 写入的字节数,默认为 buffer.length
encoding - 使用的编码。默认为 'utf8'
返回值:返回实际写入的大小。如果 buffer 空间不足, 则只会写入部分字符串。

从缓冲区取数据:
语法:buf.toString([encoding[, start[, end]]])
参数: encoding - 使用的编码。默认为 'utf8'
start - 指定开始读取的索引位置,默认为 0
end - 结束位置,默认为缓冲区的末尾
返回值:解码缓冲区数据并使用指定的编码返回字符串。

BUf转化为Json对象:
语法:buf.toJSON()
返回值: json对象

缓冲区合并:
语法:Buffer.concat(list[, totalLength])
参数描述: list - 用于合并的 Buffer 对象数组列表
totalLength - 指定合并后Buffer对象的总长度
返回值:返回一个多个成员合并的新 Buffer 对象

缓冲区比较:
语法:buf.compare(otherBuffer);
参数: otherBuffer - 与 buf 对象比较的另外一个 Buffer 对象
返回值:返回一个数字,表示 bufotherBuffer 之前,之后或相同

拷贝缓冲区:
语法:buf.copy(targetBuffer[, targetStart[, sourceStart[, sourceEnd]]])
参数描述:
targetBuffer - 要拷贝的 Buffer 对象
targetStart - 数字, 可选, 默认: 0
sourceStart - 数字, 可选, 默认: 0
sourceEnd - 数字, 可选, 默认: buffer.length
返回值: None

缓冲区剪裁:
语法:buf.slice([start[, end]])

缓冲区长度:
语法: buf.length

6:Nodejs stream
四种流类型:
Readable - 可读操作
Writable - 可写操作
Duplex - 可读可写操作
Transform - 操作被写入数据,然后读出结果
另外所有的Stream 对象都是 EventEmitter 的实例;常见事件:
data - 当有数据可读时触发
end - 没有更多的数据可读时触发
error - 在接收和写入过程中发生错误时触发
finish - 所有数据已被写入到底层系统时触发

从流中读取数据:

写入数据流:

管道流,实现文件复制功能

链式流,通过连接输出流到另外一个流并创建多个流操作链的机制

7: nodejs模块系统
创建模块
首先创建一个main.js文件,代码如下:
以上实例中,代码 require('./hello') 引入了当前目录下的 hello.js 文件(./ 为当前目录,node.js 默认后缀为 js)。
Node.js 提供了 exports 和 require 两个对象,其中 exports 是模块公开的接口,require 用于从外部获取一个模块的接口,即所获取模块的 exports 对象。
接下来我们就来创建 hello.js 文件,代码如下:
在以上示例中,hello.js 通过 exports 对象把 world 作为模块的访问接口,在 main.js 中通过 require('./hello') 加载这个模块,然后就可以直接访 问 hello.js 中 exports 对象的成员函数了。
还有另外一种方式实现模块封装;
Hello.js中封装对象
main.js调用使用

8:nodejs路由
url 和 querystring 模块,解析GET、POST等参数
实例如下:



9:nodejs全局变量
_filename:表示当前正在执行的脚本的文件名
__dirname 表示当前执行脚本所在的目录
setTimeout(cb, ms) 全局函数在指定的毫秒(ms)数后执行指定函数(cb)。:setTimeout() 只执行一次指定函数
clearTimeout( t ) 全局函数用于停止一个之前通过 setTimeout() 创建的定时器。 参数 t 是通过 setTimeout() 函数创建的定时器。
setInterval(cb, ms) 全局函数在指定的毫秒(ms)数后执行指定函数(cb)。
console用法与常见的log用法相似;console.trace();可以打印相应的堆栈信息
process变量:
exit: 当进程准备退出时触发
beforeExit:当 node 清空事件循环,并且没有其他安排时触发这个事件。通常来说,当没有进程安排时 node 退出,但是 'beforeExit' 的监听器可以异步调用,这样 node 就会继续执行。
uncaughtException:当一个异常冒泡回到事件循环,触发这个事件。如果给异常添加了监视器,默认的操作(打印堆栈跟踪信息并退出)就不会发生。
Signal 事件:当进程接收到信号时就触发。信号列表详见标准的 POSIX 信号名,如 SIGINT、SIGUSR1 等。

10:nodejs常用工具
util 是一个Node.js 核心模块;
函数原型:util.inherits(constructor, superConstructor)是一个实现对象间原型继承 的函数
JavaScript 的面向对象特性是基于原型的,与常见的基于类的不同。JavaScript 没有 提供对象继承的语言级别特性,而是通过原型复制来实现的。
util.inherits 大致用法:

util.inspect(object,[showHidden],[depth],[colors])是一个将任意对象转换 为字符串的方法,通常用于调试和错误输出。它至少接受一个参数 object,即要转换的对象。
showHidden 是一个可选参数,如果值为 true,将会输出更多隐藏信息
util.isArray(object): 判断参数object是否是个数组
util.isRegExp(object):如果给定的参数 "object" 是一个正则表达式返回true,否则返回false
util.isDate(object):如果给定的参数 "object" 是一个日期返回true,否则返回false
util.isError(object):如果给定的参数 "object" 是一个错误对象返回true,否则返回false


发布了99 篇原创文章 · 获赞 8 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/CodeAsWind/article/details/79994484
今日推荐