这是我参与「第四届青训营 」笔记创作活动的第6天。
以下是深入学习Node.js以及结合上课内容写的笔记,整理了一些Node.js中可能会被忽略的知识和问题。
Stream
首先,Stream有四种流类型,分别是Readable-可读操作、Writeable-可写操作、Duplex-可读可写操作、Transform-操作被写入数据,然后读出结果
所有的Stream对象都是EventEmitter的实例。常用的事件有:
-
data-当有数据可读时触发
-
end-没有更多的数据可读时触发
-
error-在接收和写入过程中发生错误是触发
-
finish-所有数据已经被写入到地城系统时触发
var fs = require('fs');
var data1 = "写入世界";
//创建一个可写入的流,写入到文件 output.txt 中
var writeStream = fs.createWriteStream('output.txt');
//使用 utf-8 编码写入数据
writeStream.write(data1, 'UTF8');
//标记文件的末尾
writeStream.end();
// 处理流事件 ———> finish、error
writeStream.on('finish', function () {
console.log("写入完成。");
})
//监视error
writeStream.on('error', function (err) {
console.log(err.stack);
})
console.log("程序执行完毕");
var data = '';
//创建可读流
var readerStream = fs.createReadStream('input.txt');
//设置编码为utf-8
readerStream.setEncoding('UTF8');
//处理流事件 ———> data,end,and error
readerStream.on('data', function (chunk) {
data += chunk;
})
//写入成功
readerStream.on('end', function () {
console.log(data);
})
//出现错误
readerStream.on('error', (err) => {
console.log(err.stack);
})
console.log("程序执行完毕!");
运行后得出结论
读写流执行顺序(无论如何变换代码执行顺序):正常代码执行完毕(包括常规的输出,console等一系列操作)——>先执行写入——>在执行读出
REPL(交互式解释器)
执行以下任务:
读取-读取用户输入,解析输入的JavaScript数据结构并存储在内存中
执行-执行输入的数据结构
打印-输出结果
循环-循环操作以上步骤知道用户两次按下ctrl-c按钮退出
单行操作:
多行操作:
Moudles引用顺序
文件模块缓存区是指已经加载过的文件模块
优先级:文件模块缓存 > 原生模块 > 文件模块
处理GET请求和POST请求
GET和POST都是用end来结束,使用on来绑定。
GET请求
//获取GET请求内容
let http = require('http');
let url = require('url');
let util = require('util');
http.createServer(function (req, res) {
res.writeHead(200, {
'Content-type': 'text-plain; charset=utf-8'
});
let params = url.parse(req.url, true).query;
res.write("name:" + params.name + "\n");
res.end(util.inspect(url.parse(req.url, true)));
}).listen(3000);
POST请求,与GET请求不同的是,POST请求使用querystring组件而不是使用url组件
//处理 POST 请求
let http = require('http');
let querystring = require('querystring');
let util = require('util');
let postHTML =
'<html><head><meta charset="utf-8"><title>菜鸟教程 Node.js 实例</title></head>' +
'<body>' +
'<form method="post">' +
'网站名: <input name="name"><br>' +
'网站 URL: <input name="url"><br>' +
'<input type="submit">' +
'</form>' +
'</body></html>';
http.createServer(function (req, res) {
// 定义了一个post变量,用于暂时存储请求体的信息
let post = '';
//通过req的data事件监听函数,每当接受请求体的数据,就累加到post变量中
req.on('data', function (chunk) {
post += chunk;
});
//在end事件触发后,通过querystring.parse将post解析为POST请求格式,然后向客户端返回
req.on('end', function () {
post = querystring.parse(post);
res.writeHead(200, { 'Content-Type': 'text/html;charset=utf8' })
if (post.name && post.url) { //输出提交的数据
res.write("网站名:" + post.name);
res.write("<br>");
res.write("网站URL:" + post.url);
} else { //输出表单
res.write(postHTML);
}
res.end();
});
}).listen(3000);