这是我参与「第四届青训营 」笔记创作活动的第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是单线程,但是这种异步函数的处理方式极大的优化了性能,防止因为一条线程造成阻塞的现象
EventEmitter
大多数情况下我们不会直接使用EventListener,而是在对象中继承它。
只要是支持事件响应的核心模块都是EventListener的子类
为什么要这样做呢?原因有两点: 首先,具有某个实体功能的对象实现事件符合语义,事件的监听和发生应该是一个对象的方法。其次,JavaScript的对象机制是基于原型的,支持部分多重继承,继承EventEmitter不会打乱对象原有的继承关系