- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
Node.js面试题及答案(贴合真实面试场景)
一、基础核心题(考察基本功)
1.说说Node.js的特点和适用场景,以及不适合的场景
答案:
Node.js基于V8引擎,核心特点是单线程、非阻塞I/O、事件驱动。单线程指主线程只有一个,但通过libuv的线程池处理异步操作(如文件I/O、网络请求),避免了线程切换开销;非阻塞I/O意味着发起请求后不会等待结果,继续执行后续代码,通过回调/Promise/async-await处理结果;事件驱动则是通过事件循环(EventLoop)调度异步任务。
适用场景:
高并发I/O场景:如API接口服务、即时通讯(IM)、直播弹幕
数据流式处理:如日志分析、文件上传下载
轻量级后端服务:如中间层(对接多服务、数据转发)、SSR(服务端渲染)
不适合场景:
CPU密集型任务:如大规模计算、视频编码(单线程会被阻塞,虽可通过cluster或子进程缓解,但效率不如多线程语言)
强事务性场景:如银行转账(需要复杂的事务支持,Node.js生态相对薄弱,不如Java/Go成熟)
2.解释Node.js的事件循环(EventLoop)流程,以及各阶段的作用
答案:
Node.js的事件循环是处理异步任务的核心,分为6个阶段(按执行顺序),每个阶段会处理对应队列的任务,直到队列清空或达到回调限制,才进入下一个阶段:
timers阶段:处理setTimeout、setInterval的回调(满足时间阈值的)
pendingcallbacks阶段:处理上一轮循环中未执行完的I/O回调(如TCP错误回调)
idle,prepare阶段:内部使用,开发者无需关注
poll阶段:核心阶段,处理I/O回调(如文件读取、网络请求),分为两步:
若poll队列非空,依次执行回调直到队列清空或达到限制
若poll队列为空,会等待新的I/O事件触发,或检查timers是否有到期任务,有则进入下一轮循环
check阶段:执行setImmediate的回调(在poll阶段空闲后立即执行)
closecallbacks阶段:处理关闭回调(如socket.on(close,...))
关键区别:setTimeout(最小延迟1ms)和setImmediate的执行顺序不确定,取决于当前事件循环的阶段;但在I/O回调内部,setImmediate一定比setTimeout先执行(因为I/O回调在poll阶段执行,之后直接进入check阶段)。
3.Node.js中模块加载机制(CommonJS)的流程
答案:
Node.js默认使用CommonJS模块规范(require/module.exports),加载流程分3步:
路径解析:require接收模块标识(如fs、./utils、/home/lib),先判断模块类型:
核心模块(如fs、path):优先加载,直接从Node.js内置模块中读取
相对路径/绝对路径模块:拼接当前文件路径,查找对应文件(可省略.js、.json、.node后缀,会自动补全查找)
第三方模块(如express):从当前目录node_modules查找,若未找到,向上级目录node_modules递归查找,直到根目录或找到模块
文件加载与编译:
加载.json文件:读取后用JSON.parse解析
加载.js文件:包裹成函数(function(exports,require,module,__filename,__dirname){...}),通过V8编译执行
加载.node文件:C/C++编译的二进制模块,直接调用
缓存机制:模块加载后会缓存到require.cache中,下次require同一模块时,直接返回缓存结果(避免重复加载);若需重新加载,可删除require.cache[模块路径]。
注意:exports是module.exports的引用,直接赋值exports={}会断开引用,无法导出内容,需用module.exports={}。
二、进阶实战题(考察项目经验)
4.如何处理Node.js中的异步错误?有哪些方案,各自适用场景
答案:
Node.js异步错误若未处理,会导致进程崩溃(生产环境致命),常用处理方案:
回调函数(err-first):
规范:回调函数第一个参数必须是错误对象(err),成功时err为null
适用场景:早期回调地狱场景(现已较少用)
示例:
fs.readFile(./test.txt,(err,data)={
if(err){consol
原创力文档


文档评论(0)