Node.js(二) | 青训营笔记

116 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第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等一系列操作)——>先执行写入——>在执行读出

image-20220803204527174

REPL(交互式解释器)

执行以下任务:

读取-读取用户输入,解析输入的JavaScript数据结构并存储在内存中
执行-执行输入的数据结构
打印-输出结果
循环-循环操作以上步骤知道用户两次按下ctrl-c按钮退出

单行操作:

image-20220801170601386

多行操作:

image-20220801170918010

Moudles引用顺序

image-20220803220507270

文件模块缓存区是指已经加载过的文件模块

优先级:文件模块缓存 > 原生模块 > 文件模块

处理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);