node梳理

node
Node.js 使用了事件驱动、非阻塞式 I/O 的模型
Node在处理高并发,I/O密集场景有明显的性能优势

高并发,是指在同一时间并发访问服务器
I/O密集指的是文件操作、网络操作、数据库,相对的有CPU密集,CPU密集指的是逻辑处理运算、压缩、解压、加密、解密

http


const http = require('http');

const server = http.createServer((req, res) => {
  res.statusCode = 200; // 设置状态码
  res.setHeader('Content-Type', 'text/plain'); // 设置响应头
  res.end('Hello, World!\n'); // 结束响应
});

// 服务器监听端口
server.listen(3000, () => {
  console.log('服务器正在运行在 http://localhost:3000/');
});

https

const https = require('https');
const fs = require('fs');

// 读取 SSL 证书
const options = {
  key: fs.readFileSync('server-key.pem'), // 私钥
  cert: fs.readFileSync('server-cert.pem') // 证书
};

const server = https.createServer(options, (req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello, Secure World!\n');
});

// 服务器监听端口
server.listen(3000, () => {
  console.log('HTTPS 服务器正在运行在 https://localhost:3000/');
});

stream

const fs = require('fs');

// 创建可读流和可写流
const readable = fs.createReadStream('source.txt');
const writable = fs.createWriteStream('destination.txt');

// 使用 pipe 方法将数据从可读流写入可写流
readable.pipe(writable);

// 监听事件
writable.on('finish', () => {
  console.log('数据已成功复制到 destination.txt');
});

readable.on('error', (err) => {
  console.error('读取错误:', err);
});

writable.on('error', (err) => {
  console.error('写入错误:', err);
});

// readable.unpipe(writable);

EventEmitter 事件监听手写实现

class event {
    constructor() {
        this.listeners = {}
    }
    on(event, listener) {
        // 开始监听
        if (this.listeners[event] && this.listeners[event].length) {

        } else {
            this.listeners[event] = []
        }
        this.listeners[event].push(listener)
    }
    removeListener(event, listener) {
        // 取消监听
        if (this.listeners[event]) {
            const index = this.listeners[event].indexOf(listener)
            if (index !== -1) {
                this.listeners[event].splice(index, -1)
            }
        }
    }
    removeAllListeners(event) {
        this.listeners[event] = []
    }
    emit(event, params) {
        // 触发实践
        if (this.listeners[event]) {
            this.listeners[event].forEach(listener => {
                listener.apply(this, params)
            });
        }
    }
    once(event, listener) {
        if (this.listeners[event]) { } else { this.listeners[event] = [] }
        this.listeners.push(
            ()=>{
                listener()
                this.removeListener(event,listener)
            }
        )
    }
}

const bus = new EventBus();

this指向 默认会指向 EventEmitter 示例 ,所以使用apply方法改变this指向listener.apply(this, params)
箭头函数 指向 声明时所在的上下文

posted @ 2025-03-31 14:17  张正1998  阅读(17)  评论(0)    收藏  举报