nodejs入门(2)--模块

1.fs

1>文件操作
一:读取文件

异步读取

fs.readFile("1.txt", "utf-8", function (err, data) {
    if (err) {
        console.error(err);
        return;
    }
    console.log(data);
});

para1:path
para2:encoding
para3:cb(err,data)
无返回值

同步读取

var data = fs.readFileSync("1.txt", "utf-8");
console.log("data: " + data);

para1: path
para2: encoding
有返回值

二:写入文件
>whiteFile

fs.writeFile("2.txt", "哈哈哈哈哈哈哈哈,我会进入文件中", {
flag: "a"
}, function (err) {
if (err) {
console.error(err);
return;
}
console.log("文件写入成功");
});

param1: path
param2: content
param3: options
                        --  flag: a 追加
                   -- flag: w 写入
param4: cb(err)



> appendFile 

fs.appendFile("3.txt", "家乐福卡的设计费可拉伸的机发送的", function (err) {
if (err) {
console.log(err);
return;
}
console.log("文件写入成功");
});

param1: path
param2: content
param3: cb(err)

拓展---复制文件

var fs = require('fs');
fs.readFile("index.html", "utf-8", function (err, data) {
if (err) {
console.error(err);
return;
}
// 写入文件
fs.writeFile("index4.html", data, {
flag: "w",
encoding: "utf-8"
}, function (err) {
if (err) {
console.error(err);
return;
}
console.log("文件赋值成功");
});
});



2>目录操作
 >创建目录

var fs = require('fs');
fs.mkdir("dirName", 0777, function (err) {
if (err) {
console.error(err);
}
});

param1: dirname
param2: 0777
    -权限问题(扩展)
        --mode 三个数字,分别代表owner(所有者),group(组用户),others(其他用户)所具有的权限
        ---1 = x 执行
        ---2 = w 写入
        ---4 = r 读
        ---比如owner所具有的权限: 1 + 2 + 4 = 7
param3: cb(err)


读取目录readdir
>```
var fs = require('fs');
fs.readdir("test", function (err, files) {
    if (err) {
        console.error(err);
        return;
    }
    // files为一个数组,保存所有文件的名称
    console.log(files);
});

param1: dirname
param2: cb(err, cb)

判断文件是否存在exists

var fs = require('fs');
fs.exists("test/test7", function (res) {
console.log(res);
});

param1: dirname
param2: cb(res)

查看目录或者文件详情stat
>```
var fs = require('fs');
fs.stat("test/hah.txt", function (err, stat) {
    if (err) {
        console.error(err);
        return;
    }
    console.log(stat);
});

param1: dirname
param2: cb(err, stat)

修改文件名rename

var fs = require('fs');
fs.rename("test", "testttttttt", function (err) {
if (err) {
console.error(err);
return;
}
console.log("名称修改成功");
});

param1: oldname
param2: newname
param3: cb(err)

相对路径获取绝对路径realpath
>```
var fs = require('fs');
fs.realpath("test", function (err, path) {
    if (err) {
        console.error(err);
        return;
    }
    console.log(path);
});

param1: dirname
param2: cb(err)

2 util

1.类型验证

console.log(util.isArray([])); // 验证数组
console.log(util.isRegExp(/\d/)); // 验证正则表达式

实现继承
继承原型中的内容,而不继承自身的内容
util.inherits(class, superClass);

// 实现继承
function Person() {
    this.name = "哈哈";
    this.age = 30;
    this.say = function () {
        console.log(this.name);
    };
}
Person.prototype.showAge = function () {
    console.log(this.age);
};
function Student() {
    Person.apply(this, arguments);
    this.name = "呵呵";
}
// 实现继承
util.inherits(Student, Person);
Student.prototype.show = function() {
    console.log("haha");
};
var personObj = new Person();
var studentObj = new Student();
studentObj.say();
studentObj.showAge();
studentObj.show();

3.events

获取事件模块
var events = require('events').EventEmitter(); // 旧的写法
var events = require('events'); // 新的写法
绑定事件
obj.on(“eventName”, function);
obj.addListener(“eventName”, function);
触发事件
obj.emit(“eventName”);
绑定只会触发一次的事件
obj.once(“eventName”, function);

girl.once("die", function () {
    console.log("哈哈哈");
});```

#4.buffer类
缓存区:暂时存放内存里的一段数据

JS自身只有字符串,没有二进制类型在处理文件流时,需要使用二进制数据,因此Node中,定义了一个buffer类

由一个八位字节一个字节元素组成的数组,单位用16进制表示,取值范围为0-255

buffer对象相关方法

1.创建长度为12buff
>// 创建长度为12的数组
var buff = new Buffer(12);
// (填充的值,开始位置,结束位置(没有既全部))
buff.fill(255, 0, 4);
console.log(buff);

2通过数组创建
>var buff = new Buffer([1, 2, 3]);
console.log(buff);

3通过字符串创建
>var buff = new Buffer("李大泽");
console.log(buff);

4将buff转为字符串
>var buff = new Buffer([0xe6, 0x9d, 0x8e, 0xe5, 0xa4, 0xa7, 0xe6, 0xb3, 0xbd]);
console.log(buff.toString());

5.buff连接

var buff1 = new Buffer([0xe6, 0x9d, 0x8e, 0xe5]);
var buff2 = new Buffer([0xa4, 0xa7, 0xe6, 0xb3, 0xbd]);
var buff3 = Buffer.concat([buff1, buff2]); // 连接两个buff,但是会占用过高内存
console.log(buff1.toString());
console.log(buff2.toString());
console.log(buff3.toString());

// Node中推荐的方式

var StringDecoder = require('string_decoder').StringDecoder;
var decoder = new StringDecoder();
console.log(decoder.write(buff1));
console.log(decoder.write(buff2));


#5.stream

---简介

Stream与大数据处理密不可分
之前的文件拷贝,看似没问题,但是对于大文件,会产生内存占用过高问题
var fs = require('fs');
function copy(src, dest) {
fs.writeFile(dest, fs.readFileSync(src));
}
copy("data.json", "dataStream.json");

---解决的问题和方法
内存爆仓
`写入数据跟不上读取速度,写入和读取的速度不一致,未被写入的数据在内存中不断扩大,就会出现内存爆仓`

创建 readStream 和 writeStream,将文件作为一小块一小块的数据流进行处理,而不是一整块技术

var fs = require('fs');
var rs = fs.createReadStream("data.json");
var ws = fs.createWriteStream("data2.json");
rs.on("data", function (chunk) {
console.log("数据读取中。。。。");
ws.write(chunk, function () {
console.log("数据写入成功");
});
});
rs.on("end", function () {
console.log("数据读取完毕");
});


`fs.createReadStream()`
`fs.createWriteStream()`

---pipe

var fs = require('fs');
var rs = fs.createReadStream("data.json");
var ws = fs.createWriteStream("data3.json");
rs.pipe(ws);

    连接两个数据流,犹如导管一样将数据读入写入
    `rs.pipe(ws);`
#6.http
---主要用于搭建HTTP服务器和客户端

---http: 超文本传输协议

---常用api
----创建服务器

var http = require('http');
http.createServer(function (req, res) {
var urlStr = req.url; // 获取请求的路径
var urlMethod = req.method; // 获取请求的方法
console.log(urlStr);
console.log(urlMethod);
res.end();
}).listen(8888, function (err) {
if (err) {
console.error(err);
return;
}
console.log("服务器启动成功");
});
createServer
listen

处理请求

var http = require('http');
var url = require('url');
http.createServer(function (req, res) {
var urlStr = req.url;
var methodStr = req.method;
// console.log(req.headers); // 获取请求头
// console.log(req.httpVersion); // 获取http版本
/*
* 获取GET请求的参数
// 使用url模块对url进行解析
var urlObj = url.parse(urlStr, true);
// 获取get参数
console.log(urlObj.query.name);
*/

// 获取POST请求的参数
req.on("data", function (chunk) {
    console.log(chunk.toString());
});

res.writeHead(200, {"Content-Type": "text/html;charset=utf-8"});
res.end();

}).listen(8888, function (err) {
console.log("服务器启动成功");
});

获取get请求的参数

var urlObj = url.parse(urlStr, true);
console.log(urlObj.query);

获取post请求的参数

req.on("data", function (chunk) {
console.log(chunk.toString());
});

网页中实现请求的发送

var http = require('http');
var url = require('url');
var fs = require('fs');
http.createServer(function (req, res) {
var urlStr = req.url;
var urlObj = url.parse(urlStr, true);
var method = req.method;
var pathname = urlObj.pathname;
if (pathname == "/login.html") {
fs.readFile("login.html", function (err, data) {
res.write(data);
res.end();
});
} else if (pathname == "/test") {
// console.log(urlObj.query);
req.on("data", function (chunk) {
console.log(chunk.toString());
});
res.end();
}
}).listen(8888, "localhost", function (err) {
if (err) {
console.error(err);
return;
}
console.log("服务器启动成功");
});;

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

推荐阅读更多精彩内容