nodejs 面试真题讲解

212 阅读3分钟

前言:

以下内容来自2024 版:Node.js+Express+Koa2+Nest.js 开发服务端第16章

1. nodejs是什么?

nodejs是基于Chorme v8的运行环境,node出现之前,js只能在浏览器中运行,node出现之后,js可以在任何安装nodejs的环境运行

2. nodejs和前端js的区别是什么?

前端JavaScript主要包括ECMAScript(ES6是其一个版本)以及Web API(包括DOM、BOM等)。ECMAScript负责定义JavaScript的语法规则,而Web API则是浏览器提供的各种对象和方法,用于实现网页上的各种交互效果。

Node.js是一个JavaScript运行环境,它的核心也是基于ECMAScript规范,同时也提供了很多附加的API,用于实现文件操作、网络编程、数据流等功能。这些API都是Node.js特有的,和浏览器环境下的Web API是不同的。

image.png

  • 前端js用于网页,在浏览器运行
  • nodejs可用于服务端,如开发web server
  • nodejs也可用于本机,如webpack等本机的工具

3. nodejs调试

参考前文

4. 当前文件和目录的路径如何获取

*   `__filename` (全局变量)
*   `__dirname`(全局变量)

5. path.resolve和path.join的区别

image.png path.join只是简单的将路径片段进行拼接,并规范化生成一个路径,而path.resolve则一定会生成一个绝对路径,相当于执行cd操作。

6. commonjs和es6的区别

  • 语法不同
  • commonjs是动态引入,执行时引入
  • es6是静态引入,编译时引入

所以webpack tree shaking 只支持es6模块,不支持commonjs

image.png

7. eventloop在nodejs和浏览器中的区别

  • 浏览器

    • 同步代码执行完后,将触发Event loop机制,执行宏任务
    • 触发Event Loop之前,会把现有的微任务都执行完
    • 所以微任务比红任务执行时机更早
  • nodejs

    • settimeout、setinterval (宏任务)
    • promise、async/await (微任务)
    • process.nextTick(微任务)(Node.js提供的一个API,用于在当前执行栈中的所有同步任务执行完毕后,但在事件循环开始之前,执行一个回调函数
    • setimmediate(宏任务)(允许你将一个函数推迟到当前事件循环的末尾执行
    • I/O 文件 网络(宏任务)
    • socket连接,如连接mysql(宏任务)
  • nodejs执行顺序(和浏览器相同)

    • 先执行同步代码
    • 执行微任务
    • 执行宏任务,回到第二步 nodejs宏任务比较多,需要分开

image.png

image.png

image.png 建议用setImmediate代替process.nextTick

image.png

注意:新版的nodejs已经和浏览器趋同

8. async、await执行顺序场景题

// 输出顺序
setImmediate(() => {
    console.log('immediate')
})

async function async1 () {
    console.log('async1 start')
    await async2() // 同步
    console.log('async1 end') // await 后面的内容,异步(微任务),相当于callback函数
}

async function async2 () {
    console.log('async2')
}

console.log('script start')

setTimeout(() => {
    console.log('setTimeout')
}, 0)

async1()

new Promise((resolve) => {
    console.log('promise1') //同步
    resolve() // 触发.then, .then是微任务
}).then(() => {
    console.log('promise2')
})

process.nextTick(() => {
    console.log('nextTick')
})

console.log('script end')


script start
async1 start
async2
promise1
script end
nextTick
async1 end
promise2
setTimeout
immediate

9. session如何实现登录

  • cookie 如何实现登录校验
  • session 和cookie的关系
  • session 为何需要存储在redis中

image.png

image.png 直接传cookie不安全,所以有了session,session记录标识和用户信息的关系

image.png

10. koa2和express的中间件机制

  • 从代码看,中间件就是一个函数
  • 从业务看,中间件则是一个独立的模块
  • 模块拆分,模块流转,即可完成复杂的功能

Q:如何实现一个中间件

11. 描述koa2洋葱圈模型

image.png

12. 如何逐行读取一个1g大小的日志文件

image.png

image.png

image.png

13. nodejs线上环境为何开启多进程

  • 高效使用多核CPU
  • 充分利用服务器内存