热门标签 | 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);


推荐阅读
  • mongoDB高可用集群环境搭建
    2019独角兽企业重金招聘Python工程师标准在生产环境下,部署一台mongodb服务的话,会存在以下问题:单点问题生产环境是一个 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • PatchODAX8: ... [详细]
  • 大厂首发!思源笔记docker
    JVMRedisJVM面试内存模型以及分区,需要详细到每个区放什么?GC的两种判定方法GC的三种收集方法:标记清除、标记整理、复制算法的 ... [详细]
  • Abp+MongoDb改造默认的审计日志存储位置
    一、背景在实际项目的开发当中,使用AbpZero自带的审计日志功能写入效率比较低。其次审计日志数据量中后期十分庞大,不适合与业务数据存放在一起。所以我们可以重新实现A ... [详细]
  • 【系列二】长连接,短连接及WebSocket介绍(含http1.0,1.1,2.0相关)
    前言上一节讲了长轮询和轮询及其实现,这节讲一讲长连接、短连接及webSocket,在讲这些之前,我们先来普及一下http相关的一 ... [详细]
  • 一、前言2012年毕业,2016年转行,没有一个体面的工作,机缘巧合之下,来到了大连,Java培训,一个全新的领域,迷茫、困惑、漫无目的的努力,转行真的被歧视,真的不行吗?我命由我 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
  • Centos下安装memcached+memcached教程
    本文介绍了在Centos下安装memcached和使用memcached的教程,详细解释了memcached的工作原理,包括缓存数据和对象、减少数据库读取次数、提高网站速度等。同时,还对memcached的快速和高效率进行了解释,与传统的文件型数据库相比,memcached作为一个内存型数据库,具有更高的读取速度。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • 来吹下汽车
    最近帮同事的一个朋友选车,最后他决定了一汽大众的迈腾,也就是海外版(欧洲为主)的帕萨特B8,国内如果加长过的话,应该叫B8L吧。基于大众最新的通用MQB平台(模块化横置发动机平台) ... [详细]
  •     系统采用jeeplus框架(ssm+redis+shiro+mongodb+redis),默认是做了JSP未做前后端分离,由于业务需要已经多终端使用的需求(H5、小程序等) ... [详细]
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社区 版权所有