【前端面试】node面试题整理

Node.js 是一个使用 JavaScript 作为其脚本语言并运行 Chrome 的 V8 JavaScript 引擎的虚拟机。用来开发可扩展的服务端程序。使用了事件驱动和非阻塞I/O模型

express框架

express框架是一个基于 Node.js 平台的极简、灵活的 web 应用开发框架,主要基于 Connect 中间件,并且自身封装了路由、视图处理等功能。
优点:线性逻辑,通过中间件形式把业务逻辑细分、简化,一个请求进来经过一系列中间件处理后再响应给用户,清晰明了。
缺点:基于 callback 组合业务逻辑,业务逻辑复杂时嵌套过多,异常捕获困难。
目录结构
	./app.js  应用核心配置文件(入口文件)
	./bin  存放启动项目的脚本文件
	./ package.json  存储项目的信息及模块依赖
	./public 静态文件(css、js、img等)
	./node_modules  存放npm安装到本地依赖包
	./views 页面文件(jade模板)
response的常用方法
	res. download( ),弹出文件下载。
	res.end ( ),结束响应。
	res.json( ),返回json。
	res.jsonp( ),返回 jsonp。
	res .render ( ),渲染模板。

应用场景

web开发可以用js运行在服务端,nodejs为js提供了运行时的平台
开发效率高,js动态语言,不强制要求类型
io性能强劲,依靠libuv,不用考虑多线程等复杂操作(锁),降低开发成本
有强大的npm包平台,类似Java的maven
前后端语言统一,降低开发成本

nodejs与js区别

js的全局对象是windows;nodejs是global
nodejs不用考虑兼容性,因为是服务端
Node的事件循环依赖底层libuv,JavaScript的事件循环依赖的是浏览器

nodejs与java区别和优缺点

node单线程;java多线程
javascript单线程,开发成本低,io多线程由libuv提供,去掉了操作多线程的成本。java多线程,性能没问题,相比node,虽然没有libuv,但可以自己管理线程池
javascript是解释性语言,运行时才进行编译检查。而java是半编译半解释型语言
javascript是弱类型语言,编码中不强制类型。java是强类型语言,编码中强制类型
node使用的是js语言,前后统一,降低开发成本

nodejs的网络模块:

Node. js全面支持各种网络服务器和客户端,包括TCP、HTP/ HTTPS、TCP 、UDP、DNS、tls/ssl等。

线程与进程的区别

一个程序至少有一个进程,一个进程至少有一个线程
线程的划分尺度小于进程,使得多线程程序的并发性高
进程在执行过程中拥有独立的内存单元,而多个线程共享内存,极大地提高了程序的运行效率
线程在执行过程中与进程有区别。每个独立的线程都有程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看作多个独立的应用来实现进程的调度、管理和资源分配。这是进程和线程的主要区别。

栈与堆

栈( stack)区由编译器自动分配和释放,存放函数的参数值、局部变量的值等。

堆(heap)区一般由程序员分配和释放,若程序员不释放,程序结束时可能由OS回收。
堆(数据结构)可以被看成一棵树,如堆排序。栈(数据结构)是一种先进后出的数据结构。

API函数

异步、非阻塞函数:主要是 I/O 操作,可以从主循环中分叉出来。异步是通过一次次的循环事件队列来实现的
同步的、阻塞的函数 :主要是影响在主循环中运行的进程的操作。

异步流程的控制

多层嵌套回调。
为每一个回调写单独的函数,函数里边再回调。
用第三方框架,如 async、q、 promise等。

nodejs的事件循环

由事件循环使用队列和侦听器进行管理
当需要执行异步函数(或 I/O)时,主线程将其发送到不同的线程,从而允许 v8 继续执行主代码。
事件循环涉及具有特定任务的不同阶段,例如计时器、挂起的回调、空闲或准备、轮询、检查、关闭具有不同 FIFO 队列的回调。
同样在迭代之间,它会检查异步 I/O 或计时器,如果没有则干净地关闭。
一次事件循环机制可以将所有的微任务执行完毕,一次事件循环只能执行一个宏任务。
总体顺序是:IO事件→ setImmediate→ setTimeout/setInterval→ process. nextTick。

fork

fork 一般用于生成子进程
在 node 中,它用于创建一个新的 v8 引擎实例来运行多个 worker 来执行代码。负责两个nodejs程序之间的交互
	子程序用 process.on、 process. send访问父程序
	父程序用 child.on、 child.send访问子程序。

EventEmitter

一个实现观察者模式的类,主要功能是订阅和发布消息,用于解决多模块交互而产生的模块之间的耦合问题.
应用
	在模块间传递消息。
	在回调函数内外传递消息。

子进程和进程的 stdin、 stdout、 stderror

概念都是一样的。stdin、 stdout、 stderror分别是输入、输出、错误。三者都是流。区别是在父进程里,子进程的 stdout是输入流, stdin是输出流。

npm

作用
	允许用户从npm服务器下载别人编写的第三方包到本地。
	允许用户从npm服务器下载并安装别人编写的命令行程序到本地。
	允许用户将自己编写的包或命令行程序上传到npm服务器供别人使用。
	一个网端模块的存储介质。
	安装程序依赖和版本管理。

优点

Node.js 提供了简单的开发,因为它的非阻塞 I/O 和基于偶数的模型导致较短的响应时间和并发处理,这与开发人员必须使用线程管理的其他框架不同。
	如何克服I/O操作阻塞问题:由于节点有一个事件循环,可用于以异步方式处理所有 I/O 操作,而不会阻塞 main 函数。
因此,例如,如果需要进行一些网络调用,它将被安排在事件循环中,而不是主线程(单线程)中。
如果有多个这样的 I/O 调用,每个调用都会相应地排队分别执行(除了主线程)。
因此,即使我们有单线程 JS,I/O 操作也是以非阻塞方式处理的。
它运行在 chrome v8 引擎上,该引擎是用 c++ 编写的,并且具有不断改进的高性能。
此外,由于我们将在前端和后端都使用 Javascript,因此开发速度会快得多。

特点

单线程的,异步处理的方式,可以处理大量的数据吞吐量,有很高的可扩展性,使用JavaScript作为主流编程语言。使用的是异步处理机制和事件驱动。处理高效。
	处理并发:主循环是单线程的,所有异步调用都由 libuv 库管理。
事件驱动
	典型的发布订阅模式,只有事件发生的时候才调用回调函数。其中会有一个事件队列不断的获取事件来执行
	原理
		事件循环是 Node.js 处理非阻塞 I/O 操作的机制——尽管 JavaScript 是单线程处理的——当有可能的时候,它们会把操作转移到系统内核中去。
		既然目前大多数内核都是多线程的,它们可在后台处理多种操作。当其中的一个操作完成的时候,内核通知 Node.js 将适合的回调函数添加到 轮询 队列中等待时机执行
	NodeJs事件驱动和浏览器的事件循环区别
		在 nodejs 中事件循环不再是由单一个 宏任务和 微任务 组成,而是由多个 阶段 phase 的多个回调函数队列 callbacks queues 组成一次事件循环 tick。 并且在每一个单独的阶段都存在一个单独的 回调函数 FIFO 队列
	优点
		适合处理密集型I/O任务:通过事件循环机制,多个并行的任务,在JavaScript处理起来,只是将不同的任务分配给不同的线程,等待返回结果执行即可。所以处理速度超级快,有很高的实时性。
		适合处理高并发:RESTful Api动辄发起成千上万条请求,但是请求本身并没有太多的计算量,开启多线程处理等待结果又太浪费机器性能。所以事件循环非常适合处理此种场景。
		适合处理少量业务逻辑:例如浏览器中,在处理用户交互事件,页面渲染等少量业务逻辑的场景上,具有很好实时性,能给用户提供很流畅的体验。
	缺点
		不适合cpu密集型应用:因为JavaScript单线程的设计,因此,对于高强度运算的任务,可能会因为运算能力有限,导致任务处理时间过长,影响后续任务执行。
			解决办法: 将单个cpu密集型任务拆成多个子任务,留出一定时间间隔执行其他任务。
		cpu利用率低:因为单线程的原因,cpu多核性能利用率低。
		安全性低:因为单线程的原因,如果主线程发生错误,将直接导致应用崩溃。
非阻塞I/O
单线程(但io操作是多线程)

回调

回调函数:用一个函数作为参数传入另一个函数,这个函数会在某个时机被调用
	回调函数的第一个参数通常是错误对象,如果这个参数为空,表示没有错误;
回调地狱:由嵌套的回调函数导致的,这样的机制会导致有些函数无法到达,并且很难维护;
阻止回调地狱:三种方法:对每个错误都要处理到,保证代码的贯通,程序代码模块化;

repl作用

用于测试、调试和实验

api函数类型

阻滞型函数,会等到操作完成以后再进行下一步
非阻滞型函数,使用回调函数来处理当前函数获取的结果;

node与ajax

Ajax:动态更新页面的某个区域,从而不需要更新整个页面。
Nodejs:开发客户服务器类型应用的。

streams

流是一个数据传输手段,是端到端信息交换的一种方式,而且是有顺序的,是逐块读取数据、处理内容,用于顺序读取输入或写入输出
有4种类型的流数据。可读,可写。既可读,又可写,转化。
应用场景:主要就是处理IO操作,而http请求和文件操作都属于IO操作
优点:流是非阻塞式数据处理模式,可以提升效率,节省内存,有助于处理管道且可扩展等。

global的关键字

Global代表的是最上层的命名空间,用来管理所有其他的全局对象。
	所有的用户代码都是当前模块的,只在当前模块里可用,但可以通过exports对象的使用将其传递给模块外部
	在NodeJS中,用var声明的变量并不属于全局的变量,只在当前模块生效
Process 是一个全局对象,可以把异步函数转化成异步回调, 它可以在任何地方被访问,它主要是用来返回系统的应用信息和环境信息.
Buffer:可以处理二进制数据的类.
	用来处理二进制数据的,比如图片、MP3、数据库文件等。Buffer支持各种编码解码、二进制字符串互转。

全局对象

global
process
console
module
exports

定时功能

setTimeout/clearTimeout, setInterval/clearInterval、 setImmediate/clearImmediate、 process. nextTick。

处理没有被处理的异常

在应用和node js之间使用domain来处理这样的异常。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值