前端面试题-nodejs

1.什么是nodejs,它与传统的网页服务器有什么不同?

**是什么?**nodejs是基于Chrome V8引擎的JavaScript运行环境,它可以使JavaScript代码在服务器上运行。

**有什么不同?**第一,nodejs采用事件驱动、非阻塞式I/O模型,让其轻量且高效。nodejs在处理大量并发连接时,能够保持高效的性能,因为它不会每个连接都创建新的线程,而是使用单线程处理请求。这种模式降低了系统的开销,提高了整体的吞吐量。第二,nodejs是单线程的,这避免了多线程编程中的一些问题,比如线程间的数据同步和线程管理开销。第三,nodejs具有强大的包管理器npm,这有利于开发者安装和管理第三方模块。

2.nodejs的事件驱动和非阻塞I/O模型是如何工作的?

**事件驱动:**nodejs采用事件驱动的编程模式,它通过事件来触发回调函数。当web服务器接收到一个请求时,不会立即处理,而是将请求放到事件队列中。主线程会不断监听事件队列,有新事件触发,就会执行相应的回调函数来处理请求。这可以使nodejs同时处理多个请求。

非阻塞I/O:nodejs使用非阻塞I/O模型,该模型不会每个请求都创建一个新的线程或开启新的事件。相反,当服务器接收到一个请求时,它会立即返回并继续处理其他请求。对于需要执行I/O的操作,如读写文件、网络请求等,nodejs会将其放到一个线程池中进行异步处理。这样,主线程可以继续监听事件队列,而不需要等待I/O操作完成、当I/O操作完成,它会通过事件触发相应的回调函数来处理。

3.nodejs中如何进行错误处理?

1.使用try-catch语句来捕获和处理错误

javascript 复制代码
try {
//可能抛出异常的代码
}catch(err){
//处理错误的代码
}

2.使用回调函数

nodejs的部分API都可以接受回调函数作为最后一个参数,用来处理错误。

javascript 复制代码
fs.readFile('/c:/files/a.txt',function(err,data){
    if(err){
        //处理错误
    }else{
        //处理数据
    }
}

3.使用Promise

javascript 复制代码
getData().then(res => {
    //处理数据
}).catch(err => {
    //处理错误
})

4.async/await

async/await是Promise的语法糖,使异步代码看起来像同步代码

javascript 复制代码
async function fn(){
    try{
       const data = await getData()
    }catch(err){
      //处理错误
    }
}
4.nodejs中事件循环执行流程?

nodejs的事件循环是其核心之一,用于处理非阻塞I/O操作和实现异步编程。事件循环是nodejs单线程特性的关键,事件循环使nodejs能够高效的处理大量的并发请求。

工作原理:

  1. 初始化:nodejs开始运行时,会初始化事件循环。在初始化过程中,nodejs会创建一些必要的对象和主线程。
  2. 主线程:负责监听事件队列,并执行相应的回调函数。
  3. 循环体:事件循环的主体是一个循环,不断的从事件队列中取出事件并执行相应的回调函数。
  4. I/O轮询:在每个事件循环中,首先会执行I/0轮询,检查是否有新的I/O事件,如果有就将事件放到事件队列中。
  5. 定时器阶段:处理定时器的回调函数,如setTimeout、setInterval
  6. 检查阶段:检查当前事件是否与某个定时器的触发时间相等,如果相等就会执行对应的回调函数。
  7. 关闭事件回调阶段:处理所有的关闭事件的回调函数u,如文件扫描符关闭时触发的函数。
  8. 微任务队列:在事件循环迭代结束后,nodejs会检查微任务队列是否有待处理的任务,如果有就将这些任务放到微任务队列中,在下次事件循环开始时执行微任务队列。
  9. 重定当前时间:每个事件循环结束后,当前时间会被重新设定。
  10. 持续循环。
5.请解释一下Node.js的集群化工作模式?

nodejs的集群化工作模式是利用多核CPU和提升服务器性能的方法。因为nodejs是单线程的,它只能利用一个CPU核心进行工作,所以为了更好的利用多核CPU,nodejs提供了集群模块来创建多个子进程,每个子进程运行在独立的线程上,并独立的处理请求。

在集群化工作模式中,主进程负责管理所有的子进程,子进程可以接收和相应客户端请求,并独立的进行处理。

集群化的工作模式,可以提高服务器的吞吐量和响应能力。同时由于每个子进程都是独立的,它们之间不会共享内存或状态,因此可以提高应用程序的稳定性和安全性。

.....持续更新中

相关推荐
代码匠心19 分钟前
AI 自动编程:一句话设计高颜值博客
前端·ai·ai编程·claude
_AaronWong2 小时前
Electron 实现仿豆包划词取词功能:从 AI 生成到落地踩坑记
前端·javascript·vue.js
cxxcode2 小时前
I/O 多路复用:从浏览器到 Linux 内核
前端
用户5433081441942 小时前
AI 时代,前端逆向的门槛已经低到离谱 — 以 Upwork 为例
前端
JarvanMo2 小时前
Flutter 版本的 material_ui 已经上架 pub.dev 啦!快来抢先体验吧。
前端
恋猫de小郭2 小时前
AI 可以让 WIFI 实现监控室内人体位置和姿态,无需摄像头?
前端·人工智能·ai编程
哀木2 小时前
给自己整一个 claude code,解锁编程新姿势
前端
程序员鱼皮2 小时前
GitHub 关注突破 2w,我总结了 10 个涨星涨粉技巧!
前端·后端·github
UrbanJazzerati2 小时前
Vue3 父子组件通信完全指南
前端·面试
是一碗螺丝粉3 小时前
5分钟上手LangChain.js:用DeepSeek给你的App加上AI能力
前端·人工智能·langchain