热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

常见面试题集合之node

文章目录node模块请介绍一下require的模块加载机制Node基础node有哪些特征,与其他服务器端对比如何判断当前脚本运行在浏览器还是node环境中node怎么

文章目录

  • node模块
    • 请介绍一下require的模块加载机制
  • Node基础
    • node有哪些特征,与其他服务器端对比
    • 如何判断当前脚本运行在浏览器还是node环境中
    • node怎么跟MongoDB建立连接
  • V8的垃圾回收机制
    • 如何查看V8的内存使用情况
    • V8的内存分代和回收算法
    • 哪些情况会造成V8无法立即回收内存
  • webSocket
    • webSocket与传统的http有什么优势
  • 进程通信
    • 请简述一下node的多进程架构
    • 创建子进程的方法有哪些,简单说一下它们的区别
    • 你知道spawn在创建子进程的时候,第三个参数有一个stdio选项吗,这个选项的作用是什么,默认的值是什么。
    • 实现一个node子进程被杀死,然后自动重启代码的思路
    • 以上基础上,实现限量重启,比如我最多让其在1分钟内重启5次,超过了就报警给运维
    • 如何实现进程间的状态共享,或者数据共享
  • 中间件
    • 如果使用过koa、egg这两个Node框架,请简述其中的中间件原理
    • koa中间件实现源码


node模块

请介绍一下require的模块加载机制

1、先计算模块路径
2、如果模块在缓存里面,取出缓存
3、加载模块
4、输出模块的exports属性即可

Node基础

node有哪些特征,与其他服务器端对比

特征:单线程、事件驱动、非阻塞I/O

node 无法直接渲染静态页面,提供静态服务
node 没有根目录的概念
node 必须通过路由程序指定文件才能渲染文件
node 比其他服务端性能更好,速度更快

如何判断当前脚本运行在浏览器还是node环境中

通过判断 Global 对象是否为 window ,如果不为window ,当前脚本没有运行在浏览器中

node怎么跟MongoDB建立连接


  1. 引入mongoose
  2. 使用mongoose.connect()方法连接到MongoDB数据库
  3. 监听连接是否成功
  4. 然后通过node,书写接口,对数据库进行增删改查

V8的垃圾回收机制

如何查看V8的内存使用情况

使用 process.memoryUsage() ,返回如下

{rss: 4935680,heapTotal: 1826816,heapUsed: 650472,external: 49879
}

V8的内存分代和回收算法

在V8中,主要将内存分为新生代和老生代两代。新生代中的对象存活时间较短的对象,老生代中的对象存活时间较长,或常驻内存的对象。

哪些情况会造成V8无法立即回收内存

闭包和全局变量

webSocket

webSocket与传统的http有什么优势


  1. 客户端与服务器只需要一个TCP连接,比 http 长轮询使用更少的连接
  2. webSocket 服务端可以推送数据到客户端
  3. 更轻量的协议头,减少数据传输量

进程通信

请简述一下node的多进程架构

面对node单线程对多核CPU使用不足的情况,Node提供了child_process模块,来实现进程的复制,node的多进程架构是主从模式,如下所示:
在这里插入图片描述

var fork = require('child_process').fork;
var cpus = require('os').cpus();
for(var i &#61; 0; i < cpus.length; i&#43;&#43;){fork(&#39;./worker.js&#39;);
}

在linux中&#xff0c;我们通过ps aux | grep worker.js查看进程

创建子进程的方法有哪些&#xff0c;简单说一下它们的区别


  • spawn()&#xff1a; 启动一个子进程来执行命令
  • exec(): 启动一个子进程来执行命令&#xff0c;与spawn()不同的是其接口不同&#xff0c;它有一个回调函数获知子进程的状况
  • execFlie(): 启动一个子进程来执行可执行文件
  • fork(): 与spawn()类似&#xff0c;不同电在于它创建Node子进程需要执行js文件

spawn()与exec()、execFile()不同的是&#xff0c;后两者创建时可以指定timeout属性设置超时时间&#xff0c;一旦创建的进程超过设定的时间就会被杀死
exec()与execFile()不同的是&#xff0c;exec()适合执行已有命令&#xff0c;execFile()适合执行文件。

你知道spawn在创建子进程的时候&#xff0c;第三个参数有一个stdio选项吗&#xff0c;这个选项的作用是什么&#xff0c;默认的值是什么。


  • 选项用于配置在父进程和子进程之间建立的管道。
  • 默认情况下&#xff0c;子进程的 stdin、 stdout 和 stderr 会被重定向到 ChildProcess 对象上相应的 subprocess.stdin、subprocess.stdout 和 subprocess.stderr 流。
  • 这相当于将 options.stdio 设置为 [‘pipe’, ‘pipe’, ‘pipe’]。

实现一个node子进程被杀死&#xff0c;然后自动重启代码的思路

在创建子进程的时候就让子进程监听exit事件&#xff0c;如果被杀死就重新fork一下

var createWorker &#61; function(){var worker &#61; fork(__dirname &#43; &#39;worker.js&#39;)worker.on(&#39;exit&#39;, function(){console.log(&#39;Worker&#39; &#43; worker.pid &#43; &#39;exited&#39;);// 如果退出就创建新的workercreateWorker()})
}

以上基础上&#xff0c;实现限量重启&#xff0c;比如我最多让其在1分钟内重启5次&#xff0c;超过了就报警给运维


  • 思路大概是在创建worker的时候&#xff0c;就判断创建的这个worker是否在1分钟内重启次数超过5次
  • 所以每一次创建worker的时候都要记录这个worker 创建时间&#xff0c;放入一个数组队列里面&#xff0c;每次创建worker都去取队列里前5条记录
  • 如果这5条记录的时间间隔小于1分钟&#xff0c;就说明到了报警的时候了

如何实现进程间的状态共享&#xff0c;或者数据共享

Kafka这类消息队列工具

中间件

如果使用过koa、egg这两个Node框架&#xff0c;请简述其中的中间件原理


  • 洋葱圈模型&#xff0c;就是说中间件执行就像洋葱一样&#xff0c;最早use的中间件&#xff0c;就放在最外层。处理顺序从左到右&#xff0c;左边接收一个request&#xff0c;右边输出返回response
  • 一般的中间件都会执行两次&#xff0c;调用next之前为第一次&#xff0c;调用next时把控制传递给下游的下一个中间件。当下游不再有中间件或者没有执行next函数时&#xff0c;就将依次恢复上游中间件的行为&#xff0c;让上游中间件执行next之后的代码

const Koa &#61; require(&#39;koa&#39;)
const app &#61; new Koa()
app.use((ctx, next) &#61;> {console.log(1)next()console.log(3)
})
app.use((ctx) &#61;> {console.log(2)
})
app.listen(3001)
// 执行结果是1&#61;>2&#61;>3

koa中间件实现源码

// 注意其中的compose函数&#xff0c;这个函数是实现中间件洋葱模型的关键
// 场景模拟
// 异步 promise 模拟
const delay &#61; async () &#61;> {return new Promise((resolve, reject) &#61;> {setTimeout(() &#61;> {resolve();}, 2000);});
}
// 中间间模拟
const fn1 &#61; async (ctx, next) &#61;> {console.log(1);await next();console.log(2);
}
const fn2 &#61; async (ctx, next) &#61;> {console.log(3);await delay();await next();console.log(4);
}
const fn3 &#61; async (ctx, next) &#61;> {console.log(5);
}const middlewares &#61; [fn1, fn2, fn3];// compose 实现洋葱模型
const compose &#61; (middlewares, ctx) &#61;> {const dispatch &#61; (i) &#61;> {let fn &#61; middlewares[i];if(!fn){ return Promise.resolve() }return Promise.resolve(fn(ctx, () &#61;> {return dispatch(i&#43;1);}));}return dispatch(0);
}compose(middlewares, 1);


推荐阅读
  • 从无到有,构建个人专属的操作系统解决方案
    操作系统(OS)被誉为程序员的三大浪漫之一,常被比喻为计算机的灵魂、大脑、内核和基石,其重要性不言而喻。本文将详细介绍如何从零开始构建个人专属的操作系统解决方案,涵盖从需求分析到系统设计、开发与测试的全过程,帮助读者深入理解操作系统的本质与实现方法。 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • MySQL的查询执行流程涉及多个关键组件,包括连接器、查询缓存、分析器和优化器。在服务层,连接器负责建立与客户端的连接,查询缓存用于存储和检索常用查询结果,以提高性能。分析器则解析SQL语句,生成语法树,而优化器负责选择最优的查询执行计划。这一流程确保了MySQL能够高效地处理各种复杂的查询请求。 ... [详细]
  • 从运维繁忙到屡获殊荣:一位CIO的辉煌转型之路
    企业首席信息官(CIO)常常面临一个棘手的问题:如何有效推动公司的数字化转型?尽管数字化转型已成为企业未来发展的重要共识,但如何具体实施依然是许多CIO面临的重大挑战。在日常运营中,企业需要处理大量的业务问题和制定各种发展规划,这使得数字化转型往往被排在较低的优先级。此外,不断涌现的新问题和新规划也常常打乱原有的计划,进一步增加了转型的难度。 ... [详细]
  • TypeScript 实战分享:Google 工程师深度解析 TypeScript 开发经验与心得
    TypeScript 实战分享:Google 工程师深度解析 TypeScript 开发经验与心得 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 探讨如何在Go语言中高效地处理大规模切片的去重操作,特别是针对百万级数据量的场景。 ... [详细]
  • 浏览器作为我们日常不可或缺的软件工具,其背后的运作机制却鲜为人知。本文将深入探讨浏览器内核及其版本的演变历程,帮助读者更好地理解这一关键技术组件,揭示其内部运作的奥秘。 ... [详细]
  • OpenAI首席执行官Sam Altman展望:人工智能的未来发展方向与挑战
    OpenAI首席执行官Sam Altman展望:人工智能的未来发展方向与挑战 ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • 利用ZFS和Gluster实现分布式存储系统的高效迁移与应用
    本文探讨了在Ubuntu 18.04系统中利用ZFS和Gluster文件系统实现分布式存储系统的高效迁移与应用。通过详细的技术分析和实践案例,展示了这两种文件系统在数据迁移、高可用性和性能优化方面的优势,为分布式存储系统的部署和管理提供了宝贵的参考。 ... [详细]
  • 深入浅析JVM垃圾回收机制与收集器概述
    本文基于《深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)》的阅读心得进行整理,详细探讨了JVM的垃圾回收机制及其各类收集器的特点与应用场景。通过分析不同垃圾收集器的工作原理和性能表现,帮助读者深入了解JVM内存管理的核心技术,为优化Java应用程序提供实用指导。 ... [详细]
  • 老杨谈IT运维 | 快速实现日志异常检测与根源分析
    在智能运维领域,指标和日志是最常用的数据来源,能够有效反映系统的运行状况和健康状态。通过对这些数据的深入分析,可以为监控和告警系统提供关键信息,帮助快速实现日志异常检测与根源分析,提升整体运维效率。 ... [详细]
  • 考前准备方面,我的考试时间安排在上午11点至12点,只需提前20分钟到达考场的接待休息区即可。由于我居住在福田区,交通便利,可以选择多种方式前往考场。为了确保顺利通过考试,我建议考生提前熟悉考试流程和环境,并合理规划出行时间,以保持良好的心态和状态。此外,考前复习应注重理论与实践相结合,多做模拟题,加强对重点知识点的理解和掌握。 ... [详细]
  • 本文深入探讨了RecyclerView的缓存与视图复用机制,详细解析了不同类型的缓存及其功能。首先,介绍了屏幕内ViewHolder的Scrap缓存,这是一种最轻量级的缓存方式,旨在提高滚动性能并减少不必要的视图创建。通过分析其设计原理,揭示了Scrap缓存为何能有效提升用户体验。此外,还讨论了其他类型的缓存机制,如RecycledViewPool和ViewCacheExtension,进一步优化了视图复用效率。 ... [详细]
author-avatar
高人arm
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有