当前位置: 首页 > article >正文

【面试】【前端】【nodejs】Node.js 面试题总结

一、Node.js 面试题总结

Node.js 是构建高性能 Web 应用和服务端开发的强大工具,在面试中会考察多核利用、进程管理、性能优化、Deno 的对比及常见核心模块的理解。以下是针对 Node.js 面试问题的总结。


  • (一)Node.js 核心原理

  • Node.js 特性

    • 单线程、事件驱动。
    • 非阻塞 I/O 模型,基于 libuv 库实现。
  • 多核 CPU 的充分利用

    • Node.js 本身是单线程运行,但可以通过

      Cluster 模块 或

      Worker Threads

      模块实现多核利用。

      • Cluster 模块:创建多个子进程,共享相同的服务器端口。
      • Worker Threads:在单独的线程中运行任务,更适合 CPU 密集型任务。
    • 示例:使用

      
      

      模块实现多核利用:

      const cluster = require('cluster');
      const http = require('http');
      const os = require('os');
      
      if (cluster.isMaster) {
          const cpuCount = os.cpus().length;
          for (let i = 0; i < cpuCount; i++) {
              cluster.fork(); // 创建子进程
          }
          cluster.on('exit', (worker) => {
              console.log(`Worker ${worker.process.pid} exited.`);
          });
      } else {
          http.createServer((req, res) => {
              res.writeHead(200);
              res.end('Hello from Node.js!');
          }).listen(8000);
      }
      

  • (二)Node.js 多进程监听同一端口

  • 实现原理

    • Node.js 使用 cluster 模块允许多个进程共享一个 TCP 服务器,通过 SO_REUSEPORT 选项使多个进程能够绑定到同一个端口。
    • SO_REUSEPORT:允许多个 socket 绑定到同一个端口,每个请求由操作系统分配给任意一个进程处理。
  • 避免端口被占用的机制

    • 子进程并不直接监听端口,而是通过主进程创建的服务器句柄处理请求。

    • 示例代码:

      const cluster = require('cluster');
      const http = require('http');
      
      if (cluster.isMaster) {
          cluster.fork(); // 主进程分配任务
          cluster.fork();
      } else {
          http.createServer((req, res) => {
              res.end('Hello from worker!');
          }).listen(3000); // 子进程共享端口
      }
      

  • (三)Deno 与 Node.js 的对比

  • Deno 简介

    • 由 Node.js 创始人 Ryan Dahl 开发,旨在改进 Node.js 的不足。
    • 内置 TypeScript 支持、更好的安全性和现代化设计。
  • Deno 优化点

    • 安全性:默认禁止文件、网络、环境变量访问,需通过显式权限开启。
    • 内置模块:无需安装第三方库(如 HTTP 服务器)。
    • TypeScript 原生支持:无需额外配置。
    • 模块管理:基于 URL,无需 node_modulespackage.json
    • 标准库:提供官方标准库,减少第三方依赖。
  • Deno 示例

    import { serve } from "https://deno.land/std@0.96.0/http/server.ts";
    
    const server = serve({ port: 8000 });
    console.log("HTTP server is running on http://localhost:8000/");
    
    for await (const req of server) {
      req.respond({ body: "Hello from Deno!\n" });
    }
    

  • (四)Node.js 的 Buffer 和 Stream

  • Buffer

    • 定义:Buffer 是 Node.js 用于处理二进制数据的类。

    • 特点:

      • 类似于 Uint8Array,但支持更多方法。
      • 常用于文件操作、网络通信等场景。
    • 示例:

      const buffer = Buffer.from('Hello, Node.js');
      console.log(buffer.toString()); // 输出:Hello, Node.js
      
  • Stream

    • 定义:Stream 是处理流式数据的抽象接口。
    • 流的种类:
      1. Readable Stream:可读流(如 fs.createReadStream)。
      2. Writable Stream:可写流(如 fs.createWriteStream)。
      3. Duplex Stream:双工流(既可读又可写,如 net.Socket)。
      4. Transform Stream:转换流(对流进行变换处理,如 zlib 压缩)。
  • Pull-Stream

    • 一种流处理的抽象模型,通过拉取方式动态请求数据。

    • 特点:

      • 避免了传统流模型中的背压问题。

      • 数据在需要时才被传递,提高效率。


  • (五)常见问题解析

  • Node.js 性能优化

    1. 使用缓存:如内存缓存、Redis。
    2. 减少同步阻塞:尽量使用异步方法。
    3. 利用多核 CPU:使用 ClusterWorker Threads
    4. 流式处理:避免大数据操作时占用大量内存。
  • Token 与 Cookie 的区别

    • Cookie:用于存储用户信息,浏览器自动携带。
    • Token:用户认证凭据,需通过请求头或参数手动传递。
    • 联系:都可用于用户认证,Token 更适合前后端分离。
  • Node.js 项目调试工具

    1. 内置调试器node inspect
    2. 第三方工具:如 VSCode 调试插件。
    3. 性能分析node --prof 分析性能瓶颈。

  • 二、总结

    Node.js 的核心是事件驱动与非阻塞 I/O,能高效处理高并发任务。面试中需掌握 Node.js 的多核利用、核心模块(如 Buffer、Stream)、性能优化策略及新兴技术(如 Deno)的对比。通过深入理解其机制和应用场景,可以为开发者的全栈或后端开发能力加分。


http://www.kler.cn/a/523333.html

相关文章:

  • 内网穿透实现MC联机
  • 在php中怎么打开OpenSSL
  • Node.js与MySQL模块结合:打造安全高效的用户信息管理系统
  • 第05章 11 动量剖面可视化代码一则
  • docker 学习笔记
  • 最长递增——蓝桥杯
  • 【微服务与分布式实践】探索 Dubbo
  • 程序代码篇---C++常量引用
  • Dest1ny漏洞库:中科网威 anysec 安全网关 arping 存在后台远程命令执行漏洞
  • [A-29]ARMv8/v9-GIC-中断子系统的安全架构设计(Security/FIQ/IRQ)
  • Python 数据分析 - Matplotlib 绘图
  • 第29篇:Python开发进阶:数据库操作与ORM
  • 实战纪实 | 真实HW漏洞流量告警分析
  • MLMs之Janus:Janus/Janus-Pro的简介、安装和使用方法、案例应用
  • 《网络数据安全管理条例》施行,企业如何推进未成年人个人信息保护(下)
  • UE求职Demo开发日志#8 强化前置条件完善,给物品加图标
  • 数据从前端传到后端入库过程分析
  • 【汽车电子架构】AutoSAR从放弃到入门专栏导读
  • 【2024年华为OD机试】 (C卷,200分)- 根据IP查找城市(JavaScriptJava PythonC/C++)
  • 股指期货的基差套利有什么样的风险?
  • 【后端开发】字节跳动青训营Cloudwego脚手架
  • DeepSeek 突然崛起的原因剖析及对外界的影响
  • 【MySQL】悲观锁和乐观锁的原理和应用场景
  • C基础寒假练习(3)
  • 基础IO相关知识
  • 使用jmeter进行压力测试