nodejs学习笔记1

来源:互联网 发布:rhinoceros mac 编辑:程序博客网 时间:2024/04/30 01:14

加载模块

可以用文件路径或者名称来引用模块,除核心模块的模块最终都会被映射为一个文件路径。Node核心模块将一些核心函数暴露给程序员,他们在Node进程启动时会被预先载入。
导入一个核心模块或由NPM安装的模块:
var module = require(“module_name”);
require函数会返回一个对象,表示模块对外暴露的js API.

加载核心模块

node中有一些以二进制形式发布的模块称为核心模块。只能通过模块名引用。

var http = require('http');

加载文件模块

可通过绝对路径或相对路径

var mymodule = require('/home/mymodule');var mymodule = require('./lib/mymodule');

加载文件夹模块

使用文件夹路径来加载模块。

var mymodule = require('./mymoduledir');

node会在文件夹下查找模块,寻找package.json文件的main属性。将main属性当作入口点的相对路径。如果没有package.json,那么包的入口点假定为默认值index.js.

从node_modules文件夹加载

如果一个模块名不是相对路径,也不是核心模块。那么node就会在当前目录下的node_modules文件夹中查找该模块。如果没有找到则会继续向父文件夹的node_modules目录查找。直到找到或到达根目录。

缓存模块

模块首次被加载时会被缓存起来。也就是多次调用require函数加载相同的模块,只会初始化一次模块。

缓冲区

为了能够处理二进制数据,node引入了一个二进制缓冲区。以Buffer类实现。
注:Buffer类的另一个特别之处是数据占用的内存并不是分配在js VM内存堆中的。这些对象不会被垃圾收集算法处理,它会占据一个不会被修改的永久内存地址。这避免了因缓冲区内容的内存复制所造成的CPU浪费。

创建缓冲区

var buf= new Buffer('hello world');var buf2 = new Buffer('8b76fde713ce','base64')var b64Str = buf.toString("base64");

第二个参数可以传编码格式。支持的有:
ascii–ASCII
utf8 – UTF-8
base64 – Base64
也可以通过指定容量大小来创建缓冲区。

//该缓冲区包含的数据并非是0,而是一些随机值var buf = new Buffer(1024);

操作缓冲区

var buf = new Buffer('my buffer content');console.log(buf[10]);//99buf[12]=125;console.log(buf.length);

如果给超出缓冲区边界的位置赋值,那么操作会失败,缓冲区不会发生变化。
切分缓冲区:

var buffer = new Buffer('this is the content of my buffer');var smallBuffer = buffer.slice(8,11);console.log(smallBuffer.toString());//the

切分缓冲区并没有分配新的内存,也没有进行任何复制。只不过是引用了父缓冲区不同的起始位置和结束位置。
复制缓冲区:

var buffer1 = new Buffer('this is the content of my buffer');var buffer2 = new Buffer(11);var targetStart = 0;var sourceStart = 8;var sourceEnd = 19;buffer1.copy(buffer2,targetStart,sourceStart,sourceEnd);console.log(buffer2.toString());//the content

事件发射器

能够让程序员订阅感兴趣的事件,并将回调函数绑定到事件上。当事件发射器发射事件时,对应的回调函数就会被调用。node提供了一个伪类EventEmitter来实现。也可创建自定义的事件发射器。
事件发射器就是可以发射事件的对象,而事件监听器是绑定到事件发射器上的代码。

var req = http.request(option.function(response){    response.on("data",function(data){        console.log("some data from response",data);    });    response.on("end",function(){        console.log("end");    });});req.end();

上面的response就是一个事件发射器,可以发射“data”,”end“等事件。
注:当发生error事件时,如果没有监听事件发射器就会向上抛出一个未捕获的异常。

使用事件发射器

实现了事件发射器模式的对象(比如TCP套接字,HTTP请求等)都实现了下列方法:
.addListener和.on:添加事件监听器
.once – 为指定类型的事件绑定一个仅会被调用一次的事件监听器。
.removeEventListener:删除事件监听器
.removeAllListeners:删除所有事件监听器

事件发射器允许多个监听器监听同一类型的事件。

readStream.on("data",function(data){    console.log('some data');});readStream.on("data",function(data){    console.log('some data too');});

事件发生时将按照顺序一次调用。如果第一个事件监听器抛出错误则第二个不会被调用。

创建事件发射器

创建一个继承自EventEmitter的伪类:

util = require('util');var EventEmitter = require('events').EventEmitter;var myClass = function(){};util.inherits(myClass,EventEmitter);//该方法建立了一条原型链

发射事件:

myClass.prototype.someMethod = function(){    this.emit("custom event","argument1","argument2");};

当someMethod被myClass实例调用时就会发射一个custom event事件。还发了两个参数给事件监听器。

var myinstance = new myClass();myinstance.on("custom event",function(str1,str2){    console.log("got a custom event with %s and %s",str1,str2);})

使用定时器

node同样支持setTimeout,clearTimeout,setInterval,clearInterval方法。使用与js客户端类似。
process.nextTick(callback):callback会在事件队列的所有事件处理完毕后立刻执行。也就是把函数延迟到下一轮事件循环再执行。如果callback函数是一个处理事件比较长的函数则可能会阻塞队列。

如果需要删除一个文件但又不想在对客户端做出响应之前执行该操作,则可以延迟删除操作:

stream.on('data',function(data){    stream.end('my response');    process.nextTick(function(){        fs.unlink('/path/to/file');    });});
0 0