Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。
Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。
Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。
Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.
引入模块
require();//require("http");
Node.js 异步编程的直接体现就是回调。
异步编程依托于回调来实现,但不能说使用了回调后程序就异步化了。
回调函数在完成任务后就会被调用,Node 使用了大量的回调函数,Node 所有 API 都支持回调函数。
例如,我们可以一边读取文件,一边执行其他命令,在文件读取完成后,我们将文件内容作为回调函数的参数返回。这样在执行代码时就没有阻塞或等待文件 I/O 操作。这就大大提高了 Node.js 的性能,可以处理大量的并发请求。
readFileSync("input.txt");
阻塞读取文件
readFile("input.txt",function(err,data))
非阻塞读取文件
*(阻塞是按顺序执行的,而非阻塞是不需要按顺序的)
Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。
Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。
Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。
Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.
事件的绑定:
引入事件模块
var events = require("event");
var eventEmiter = new events.EventEmitter();
//绑定事件
eventEmitter.on("事件名",callback);
为指定事件注册一个监听器,接受一个字符串 event 和一个回调函数。
eventEmitter.addListener("事件名",callback);
为指定事件添加一个监听器到监听器数组的尾部。
//触发事件
eventEmitter.emit()
//移除事件
eventEmitter.removeListener();
//
events 模块只提供了一个对象: events.EventEmitter。EventEmitter 的核心就是事件触发与事件监听器功能的封装。
Node.js buffer 缓冲区
var buf = new Buffer(10);//10字节缓冲区
给定的数组创建 Buffer
var buf = new Buffer([10,20,30,40,50]);
buf.toString();读取缓冲区的内容
buf.toJSON();//返回json对象
buf.concat();//
buf.compare()//表示 buf 在 otherBuffer 之前,之后或相同。
buf.copy();//拷贝缓冲区
buf.copy(targetBuffer[, targetStart[, sourceStart[, sourceEnd]]])
targetBuffer - 要拷贝的 Buffer 对象。
targetStart - 数字, 可选, 默认: 0
sourceStart - 数字, 可选, 默认: 0
sourceEnd - 数字, 可选, 默认: buffer.length
buf.slice(start,end)
buf.length;
buf.write();
buf.fill(value,offset,end);
使用指定的 value 来填充这个 buffer。如果没有指定 offset (默认是 0) 并且 end (默认是 buffer.length) ,将会填充整个buffer
从流中读取数据
*创建可读流
var rs = createReadStream();
rs.setEncoding("UTF8");
//处理流事件
rs.on("data",function(){});
//创建可写流
var ws = fs.createWriteStream("output.txt");
ws.write(data,'UTF8');
ws.end();
ws.on("finish",function());
ws.on("error",function());
链式流
链式是通过连接输出流到另外一个流并创建多个对个流操作链的机制。链式流一般用于管道操作。
fs.createReadStream("input.txt").
pipe(zlib.createGzip()).pipe(fs.createWriteStream('input.txt.gz'));
//
exports.world = function(){
console.log("hello world");
}
module.exports = hello;
var Hello = require('./hello');
hello = new Hello();
**全局变量**
__filename
__filename 表示当前正在执行的脚本的文件名。它将输出文件所在位置的绝对路径,且和命令行参数所指定的文件名不一定相同。
__dirname
__dirname 表示当前执行脚本所在的目录。
setTimeout(cb, ms)
setTimeout(cb, ms) 全局函数在指定的毫秒(ms)数后执行指定函数(cb)。:setTimeout() 只执行一次指定函数。
返回一个代表定时器的句柄值。
clearTimeout(t)
clearTimeout( t ) 全局函数用于停止一个之前通过 setTimeout() 创建的定时器。 参数 t 是通过 setTimeout() 函数创建的定时器。
setInterval(cb, ms)
setInterval(cb, ms) 全局函数在指定的毫秒(ms)数后执行指定函数(cb)。
返回一个代表定时器的句柄值。可以使用 clearInterval(t) 函数来清除定时器。
setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭。
console.log() console.info() console.warn()
console.log() console.dir() console.time() console.timeEnd()
process.on("exit");
process.argv
argv
argv 属性返回一个数组,由命令行执行脚本时的各个参数组成。它的第一个成员总是node,第二个成员是脚本文件名,其余成员是脚本文件的参数
process.cws();
process.hrtime();
hrtime()
返回当前进程的高分辨时间,形式为 [seconds, nanoseconds]数组。它是相对于过去的任意事件。该值与日期无关,因此不受时钟漂移的影响。主要用途是可以通过精确的时间间隔,来衡量程序的性能。
你可以将之前的结果传递给当前的 process.hrtime() ,会返回两者间的时间差,用来基准和测量时间间隔。
process.memoryUsage();
memoryUsage()
返回一个对象,描述了 Node 进程所用的内存状况,单位为字节。
nodejs 常用工具
util.inherits
util.inherits(constructor, superConstructor)是一个实现对象间原型继承 的函数。
*仅仅继承方法而不继承属性
util.inspect(object,[showHidden],[depth],[colors])是一个将任意对象转换 为字符串的方法,通常用于调试和错误输出。它至少接受一个参数 object,即要转换的对象。
util.isArray(object);
util.isRegExp(object);
util.isDate(object);
util.isError(object);
以上四个返回值均是布尔值 true false
文件操作函数
fs.open(path,flags,mode,callback);
r以读取模式打开文件。如果文件不存在抛出异常。
r+以读写模式打开文件。如果文件不存在抛出异常。
rs以同步的方式读取文件。
rs+以同步的方式读取和写入文件。
w以写入模式打开文件,如果文件不存在则创建。
wx类似 'w',但是如果文件路径存在,则文件写入失败。
w+以读写模式打开文件,如果文件不存在则创建。
wx+类似 'w+', 但是如果文件路径存在,则文件读写失败。
a以追加模式打开文件,如果文件不存在则创建。
ax类似 'a', 但是如果文件路径存在,则文件追加失败。
a+以读取追加模式打开文件,如果文件不存在则创建。
ax+类似 'a+', 但是如果文件路径存在,则文件读取追加失败。
fs.stat(path,callback);
stats.isFile()如果是文件返回 true,否则返回 false。
stats.isDirectory()如果是目录返回 true,否则返回 false。
stats.isBlockDevice()如果是块设备返回 true,否则返回 false。
stats.isCharacterDevice()如果是字符设备返回 true,否则返回 false。
stats.isSymbolicLink()如果是软链接返回 true,否则返回 false。
stats.isFIFO()如果是FIFO,返回true,否则返回 false。FIFO是UNIX中的一种特殊类型的命令管道。
stats.isSocket()如果是 Socket 返回 true,否则返回 false。
fs.writeFile(filename,data,options,callback);
fs.read(fd, buffer, offset, length, position, callback)
该方法使用了文件描述符来读取文件。
参数
参数使用说明如下:
fd - 通过 fs.open() 方法返回的文件描述符。
buffer - 数据写入的缓冲区。
offset - 缓冲区写入的写入偏移量。
length - 要从文件中读取的字节数。
position - 文件读取的起始位置,如果 position 的值为 null,则会从当前文件指针的位置读取。
callback - 回调函数,有三个参数err, bytesRead, buffer,err 为错误信息, bytesRead 表示读取的字节数,buffer 为缓冲区对象。
fs.close(fd, callback)
关闭文件
fs.ftruncate(fd, len, callback)
该方法使用了文件描述符来读取文件。
参数
参数使用说明如下:
fd - 通过 fs.open() 方法返回的文件描述符。
len - 文件内容截取的长度。
callback - 回调函数,没有参数。
fs.unlink(path, callback)
参数
参数使用说明如下:
path - 文件路径。
callback - 回调函数,没有参数。
fs.mkdir(path[, mode], callback)
path - 文件路径。
mode - 设置目录权限,默认为 0777。
callback - 回调函数,没有参数。
fs.readdir(path, callback)
参数
参数使用说明如下:
path - 文件路径。
callback - 回调函数,回调函数带有两个参数err, files,err 为错误信息,files 为 目录下的文件数组列表。
fs.rmdir(path, callback)
删除目录
nodejs多进程
child_process.exec();
//child_process.exec 使用子进程执行命令,缓存子进程的输出,并将子进程的输出以回调函数参数的形式返回。
child_process.spawn();
ex:workerProcess = child_process.spawn('node', ['support.js', i]);
使用指定的命令行参数创建新进程,语法格式如下:
child_process.fork(modulePath[, args][, options]);
child_process.fork 是spawn() 方法的特殊形式.