一、基本模块
在javascript中,有且仅有一个全局对象:window
,在Node.js中也有唯一的全局对象:global
。
process也是Node.js提供的一个对象,代表了当前的进程
二、Event事件触发器
事件驱动是node.js的核心,事件触发器也称为发布、订阅模式
// 1.事件驱动
const EventEmitter = require("events").EventEmitter;
const emitter = new EventEmitter();
emitter.on("clock", function(time) {
console.log(`${time}的闹钟已设好`);
});
emitter.emit("clock", "7:30"); // ->>> 7:30的闹钟已设好
三、fs模块
3.1 异步读取文件
- 读取文本文件
"use strict";
let fs = require("fs");
fs.readFile("./docs/sample1.txt", "utf-8", function(err, data) {
if (err) { // err参数为null的时候表示没有出错
console.log(err);
} else {
console.log(data);
}
});
// 打印出了sample1.txt的内容
- 读取文件成二进制
如果没有设置utf-8,可以直接在data那边转换,
data.toString('utf-8')
3.2 同步读取文件
与异步不同的是,不接收回调函数,函数直接返回结果
let data = fs.readFileSync("./docs/sample1.txt", "utf-8");
console.log(data); // 打印出了sample1.txt的内容
如果同步读取文件出错,可以使用try...catch
3.3异步写文件
let data = "i am content";
let data2 = "\n i am content2";
fs.writeFile("./docs/sample2.txt", data, function(err) {
if (err) {
console.log(err);
} else {
console.log("everything is ok");
}
});
//可追加内容,不覆盖原来的
fs.appendFile("./docs/sample2.txt", data2, function(err) {
if (err) {
return console.log(err);
}
});
3.4同步写文件
fs.writeFileSync("./docs/sample2.txt", data);
//可追加内容,不覆盖原来的
fs.appendFileSync("./docs/sample2.txt", data2);
3.5stat
fs.stat('sample1.txt', function (err, stat) {
if (err) {
console.log(err);
} else {
// 是否是文件:
console.log('isFile: ' + stat.isFile());
// 是否是目录:
console.log('isDirectory: ' + stat.isDirectory());
if (stat.isFile()) {
// 文件大小:
console.log('size: ' + stat.size);
// 创建时间, Date对象:
console.log('birth time: ' + stat.birthtime);
// 修改时间, Date对象:
console.log('modified time: ' + stat.mtime);
}
}
});
三、stream
流(stream)是 Node.js 中处理流式数据的抽象接口。
stream
模块用于构建实现了流接口的对象。流都是可读的,可写的,或者可读可写的,所有的流都是EventEmittrt的实现。
- 读取文件流
"use strict";
let fs = require("fs");
let rs = fs.createReadStream("./docs/sample1.txt", "utf-8");
rs.on("data", function(data) {
console.log(data);
});
rs.on("end", function() {
console.log("it is end");
});
rs.on("error", function(err) {
console.log(err);
});
这是一个读取文件流的例子,输出结果:
i am content2
i am content2
it is end
- 流写入文件
//直接写内容
let ws = fs.createWriteStream("./docs/sample1.txt", "utf-8");
ws.write("我是写入的内容1\n");
ws.write("写完了");
ws.end();
//以二进制流写入的方式
let ws = fs.createWriteStream("./docs/sample1.txt");
ws.write(new Buffer("我是写入的内容1\n", "utf-8"));
ws.write(new Buffer("写完了", "utf-8"));
ws.end();
这两种写入文件的方式是一样的
- pipe管道
可以把这个pipe看成是一个输入流和输出流的合并,两个管道拼接到一起,如下所示代码,把rs读取的数据,直接写入copy.txt中,
let rs = fs.createReadStream("./docs/sample1.txt");
let ws = fs.createWriteStream("./docs/copy.txt");
rs.pipe(ws);
默认情况下,当rs流的数据读取完毕,end
事件触发后,将自动关闭ws流。如果我们不希望自动关闭ws流,需要传入参数:
rs.pipe(ws, { end: false });
四、http
- http模块的使用
"user strict";
let http = require("http");
let server = http.createServer(function(req, res) {
console.log(req.method, req.url);
res.setHeader("content-type", "text/html; charset=utf8");
// 2. 设置响应信息
res.write("这是响应体信息...");
// 3. 结束响应
res.end("响应结束");
});
server.listen(8000);
let open = require("open");
// 使用默认浏览器打开
open("http://localhost:8000");
console.log("8000服务已启动...");
- 文件服务器
(1)url解析
let url = require("url")
console.log(url.parse('http://www.baidu.com'))
打印结果:
Url {
protocol: 'http:',
slashes: true,
auth: null,
host: 'www.baidu.conm',
port: null,
hostname: 'www.baidu.conm',
hash: null,
search: null,
query: null,
pathname: '/',
path: '/',
href: 'http://www.baidu.conm/'
}
(2)路径
let workDir = path.resolve(".");
console.log(workDir);
// F:\office\front\node-demo\node-test1\node-demo\demo1
// 路径拼接
let filePath = path.join(workDir, 'html', 'test.html')
(3) 文件服务器
// http.js
"user strict";
let http = require("http");
let fs = require("fs");
let url = require("url");
let path = require("path");
let workDir = path.resolve(".");
let server = http.createServer(function(req, res) {
let filepath = path.join(workDir, url.parse(req.url).pathname); //获取文件的实际路径
fs.stat(filepath, function(err, stat) {
if (!err && stat.isFile()) { // 判断是否是文件
res.setHeader("content-type", "text/html; charset=utf8");
fs.createReadStream(filepath).pipe(res);
} else {
res.setHeader("content-type", "text/html; charset=utf8");
res.end("404 Not Found");
}
});
});
server.listen(8000);
先通过内置的模块,根据url获取要访问文件的绝对路径,之后判断是否是文件,是则通过管道流返回给response。
五、crypto
crypto模块提供通用的加密和hash算法
let crypto = require("crypto");
let hash = crypto.createHash("md5");
// 使用签名,并且可以使用多次
hash.update("signature");
console.log(hash.digest("hex"));
// ac201fd270c3b96beab24f2829780ab2