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

94 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第5天。

以下是深入学习Node.js以及结合上课内容写的笔记,整理了一些Node.js中可能会被忽略的知识和问题。

创建一个服务器

//创建服务器
var http = require('http');

http.createServer(function (request, response) {

    //发送 HTTP 头部
    //HTTP 状态码:200,OK
    //内容类型:text/plain
    response.writeHead(200, { 'Content-Type': 'text/palin' });

    //发送响应数据 "Hello World"
    response.end('Hello World\n');
}).listen(8888);

//终端打印如下信息
console.log('Server running at http://127.0.0.1:8888/');

回调函数

var fs = require("fs");

//同步读取(阻塞读取)
var data = fs.readFileSync("README.txt");
//读出来为Buffer类型十六进制模式
console.log(data);
console.log(data.toString());
console.log("程序执行结束!");

// //异步读取(非阻塞读取)
// var p = new Promise();
//使用Promise封装readFile操作
function readMyFile(FILE) {
    return new Promise((resolve, reject) => {
        require("fs").readFile(FILE, (err, data) => {
            if (err) {
                reject(err);
            } else {
                resolve(data);
            }
        })
    })
}
readMyFile("README.txt").then(value => {
    console.log(data.toString());
    console.log("文件读取成功!");
}, reason => {
    console.log(reason);
})

事件循环

事件驱动程序: 简单来说,因为有异步函数执行的存在,当Web Server(Web服务器)接收到请求时,就会把它关闭并且执行,然后服务下一个web请求,当请求完成时,它会被放到队列的开头,结果被返回给用户。

就像web服务器只管接待顾客,而具体工作有其他员工进行,事情处理完成后结果返回给顾客,虽然JavaScript是单线程,但是这种异步函数的处理方式极大的优化了性能,防止因为一条线程造成阻塞的现象

image-20220801212626699

EventEmitter

大多数情况下我们不会直接使用EventListener,而是在对象中继承它。

只要是支持事件响应的核心模块都是EventListener的子类

为什么要这样做呢?原因有两点: 首先,具有某个实体功能的对象实现事件符合语义,事件的监听和发生应该是一个对象的方法。其次,JavaScript的对象机制是基于原型的,支持部分多重继承,继承EventEmitter不会打乱对象原有的继承关系