nodejs学习笔记

模块

  • 名词解释:每一个js文件就是一个模块,而文件路径就是模块名。每个模块(也就是每个js文件)都有requir,exports,module三个预先定义好的变量可供使用。
  • require,用于在当前模块中加载使用别的模块,传入一个模块名,返回一个模块导出对象,模块命中.js可省略。
var foo = requeire('./foo);
  • exports,是当前模块的导出对象,用于导出模块公有方法和属性,require得到的模块就是exports导出的对象。
exports.hello = function(){
console.log('hello world);
}#导出了一个公有方法
  • module,通过module对象可以访问到当前模块的一些相关信息,最多的用途事替换当前模块的导出对象
module.exports = function(){
    console.log('hello world);
}#模块默认导出对象被替换为一个函数

  • 名词解释:包就是多个子模块构成的大模块,并且所有的子模块都放在同一个目录里。一个包需要有一个入口模块,入口模块的导出对象被称为包的导出对象。
  • index.js,入口文件名,文件名的特殊之处,在于加载模块是可以使用其所在目录的路径代替模块文件路径。
var cat = require('/home/user/lib/cat');
var cat = require('/home/user/lib/index');
#也就是可以少写一部分,使得看似加载了一个包,其实还是加载了一个入口模块而已
  • package.json自定义入口模块的文件名和存放位置
{
    "name":"cat",
    "main":"./lib/main.js"
}#这样加载的时候就可以只写包名,然后根据package的路径去找入口模块,注意存放的位置
假设包路径'./user/cat'
package路径'./user/cat/package.json'
  • 版本号X.Y.Z
    <p>X,主版本号;Y,次版本号;Z,补丁版本号
    <p>版本号更新规则:
如果只是修复bug->Z位
如果新增了功能,向下兼容->Y位
如果大的变动并且向下不兼容->X为

EventEmitter

node.js所有的异步I/O操作在完成时都会发送一个事件到时间队列;node.js很多对象都会分发事件

  • EventEmitter类,events模块只提供了一个类:events.EventEmitter,EventEmitter的核心就是事件触发与实践监听器功能的封装
var events = require('events');
var eventEmitter = new events.EventEmitter();
//用法
var event = new eventEmitter();类实例化
//注册一个some_event的监听器
event.on('some_event',function(){
    console.log('some event');
})
setTimeout(funtion(){
//发射某个事件
    event.emit('some_event');
})
  • error事件
  • 如果没有设置error事件,程序会退出并输出错误信息,所要要设置error事件,避免遇到错误后整个程序崩溃。

文件操作

  • 打开文件,fs.open(path,flags[,mode],callback)
    • path 文件路径
    • flags 以何种方式打开 (r,r+,rs,rs+,w,wx...)
    • mode 设置文件权限,文件创建默认权限0666
    • callback 回调函数,带两个参数:callback(err,fd)
  • 获取文件信息,fa.stat(path,callback)
    • path 文件路径
    • callback(err,stats),stats是fs.Stats对象
    stats类中常用方法;
    stats.isFile()是否是文件
    stats.isDirectory()是否是目录
    stats.isBlockDevice()是否是块设备
    stats.isCharacterDevice()是否是字符设备
    stats.isSymbolicLink()是否是软链接
    stats.isFIFO()是否是FIFO(是unix的一种特殊类型的命令管道)
    stats.isSocket()是否是Socket
    
  • 写入文件, fs.writeFile(filename,data[,options],callback)
    • path,文件路径
    • data 要写入文件的数据,可以是String或Buffer(流)对象
    • options 对象,包含{encoding,mode,flag},默认编码为utf8,模式0666,flag为'w'
    • callback(err),注意,只有一个参数
  • 读取文件,fs.read(fd,buffer,offset,length,position,callback)
    • fd,通过fs.open()返回的文件描述符
    • buffer,数据写入的缓冲区
    • offset,缓冲区写入的写入偏移量
    • length,要从文件中读取的字节数
    • position,文件读取的起始位置,如果position的值为null,则会从当前文件指针的位置读取
    • callback(err,bytesRead,buffer),bytesRead表示读取的字节数,buffer为缓冲区对象
  • 关闭文件,fs.close(fd,callback)
    • fd,通过fs.open()方法返回的文件描述符
    • callback()回调函数,没有任何参数,可以自定义参数
  • 截取文件,fs.ftruncate(fd,len.callback)
    • fd,同上
    • len,文件内容的截取长度
    • callback,回调函数,没有参数,可以自定义参数
  • 删除文件,fs.unlink(path,callback)
    • path,同上
    • callback,回调函数,没有参数
  • 创建目录,fs.mkdir(path[,mode],callback)
    • path, 文件路径
    • mode,目录权限,默认为0777
    • callback, 回调函数,没有参数
  • 读取目录,fs.readdir(path,callback)
    • path,文件路径
    • callback(ree,files),files是目录下的文件数组列表
  • 删除目录,fs.rmdir(path,callback)
    • path,文件路径
    • callback,回调函数,没有参数

其余的方法看文档!


Buffer

  • 创建buffer类
    • var bin = new Buffer(参数),参数可以是数字,代表字节长度;参数可以是数组;参数可以是一个字符串,并且可以指定编码方式,默认utf8
  • 写入缓冲区,bin.write(string[,offset[,length]][,encoding]),返回实际写入的大小,如果buffer空间不足,则只会写入部分字符串
    • string,写入缓冲区的字符串。
    • offset,缓冲区开始写入的索引值。
    • length,写入的字节数,默认为buffer.length
    • encoding,使用的编码
  • 从缓冲区读取数据 bin.toString([encoding[,start[,end]]])
    • encoding,使用的编码
    • start,开始读取的索引位置
    • end,结束位置
  • 将Buffer转换为JSON对象bin.toJSON(),返回json对象
  • 缓冲区合并Buffer.concat(list[,totlaLength]),返回一个多个成员合并的心Buffer对象
    • list,用于合并的Buffer对象数组列表
    • totalLength,指定合并后Buffer对象的总长度
  • 缓冲区比较bin.compare(otherBuffer),返回值是一个数字,表示bin在otherBuffer之前之后或相同
  • 拷贝缓冲区bin.copy(targetBuffer[,targetStart[,sourceStart[,sourceEdnd]]])
    • targetBuffer,要拷贝的Buffer对象
    • targetStart,数字,可选,默认0
    • sourceStart,数字,可选,默认0
    • sourceEnd,数字,可选,默认buffer.length
  • 缓冲区剪裁bin.slice([start[,end]]),返回一个新的缓冲区,他和旧缓冲区指向同一块内存
  • 缓冲区长度bin.length

其余的方法看文档


Stream(数据流)(fs模块)

  • Stream有四种数据类型
    • Readable,可读操作
    • Writable,可写操作
    • Duplex,可读可写操作
    • Transform,操作被写入数据,然后读出结果
  • 所有的Stream对象都是EventEmiiter的实例,常见的事件有
    • data,当有数据可读时触发
    • end,没有更多的数据可读时触发
    • error,在接收和写入过程中发生错误时触发
    • finish,所有数据已被写入到底层系统时触发
  • 从流中读取数据
var fs = require('fs');
var data = "";
//创建可读流
var readerStream = fs.createReadStream('some.txt');
//设置编码utf8
readerStream.setEncoding('UTF8')
//处理流事件
readerStream.on('data',function(chunk){
    data+=chunk;
})
  • 写入流
//创建一个可以写入的流
var writeStream = fs.createWirteStream('some.txt');
//使用utf8编码写入数据
writeSteam.write(data,'UTF8');
//标记文件末尾
writeStream.end()
//处理事件流
writeStream.on('finish',function(){
    console.log('write end');
})
  • 管道流
    • 管道提供了一个输出流到输入流的机制,通常我们用语从一个流中获取数据并将数据传递到另外一个流中。适用于大文件的复制过程。
var fs = require('fs');
//创建可读流
var readerStream = fs.createReadStream('some.txt');
//创建可写流
var writeStream = fs.createWriteStream('another.txt');
//管道读写操作
readerStream.pipe(writeStream);
  • 链式流
    • 链式是通过连接输出流到另外一个流并创建多个对个流操作链的机制,一般用于管道操作.
    var fs = require('fs');
    var zlib = require('zlib');
    //压缩文件,从形式上看,链式流,就是不断的pipe(操作)
    fs.createReadStream('some.txt').pipe(zlib.createGzip).pipe(fs.createWriteStream('some.txt.gz'));
    

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容

  • https://nodejs.org/api/documentation.html 工具模块 Assert 测试 ...
    KeKeMars阅读 6,305评论 0 6
  • 文件系统模块是一个封装了标准的 POSIX 文件 I/O 操作的集合。通过require('fs')使用这个模块。...
    保川阅读 773评论 0 0
  • Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。nodejs由以下模块组成:引...
    麦子_FE阅读 438评论 0 2
  • 以前学习C、OC、Swift、H5的时候都没有留下痕迹,心里甚是遗憾,最近用Nodejs参与了一个web开发,果断...
    逗留阅读 419评论 0 2
  • fs模块即文件系统,所有方法都有同步或异步形式,这里暂时只介绍异步方式; readFile() fs.readFi...
    JacobMa1996阅读 238评论 0 1