Skip to content

Node.js 基础面试题

1. 什么是 Node.js?

问题:什么是 Node.js?它有什么特点?

答案: Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境,让 JavaScript 可以在服务器端运行。

主要特点

  • 事件驱动:使用事件驱动架构,适合高并发场景
  • 非阻塞 I/O:异步 I/O 操作,不会阻塞主线程
  • 单线程:使用单线程模型,通过事件循环处理并发
  • 跨平台:支持 Windows、Linux、macOS 等多种平台
  • 丰富的生态:拥有 npm 包管理器,生态丰富

2. Node.js 的应用场景

问题:Node.js 适合哪些应用场景?

答案

适合的场景

  • 实时应用:聊天室、在线游戏、实时推送
  • API 服务:RESTful API、GraphQL API
  • 微服务:轻量级微服务架构
  • 工具链:构建工具、CLI 工具
  • 流式处理:文件处理、数据转换
  • 单页应用:SPA 的服务端渲染

不适合的场景

  • CPU 密集型任务:视频编码、图像处理、复杂计算
  • 内存密集型应用:大数据处理、内存数据库

3. Node.js 的优缺点

问题:Node.js 有哪些优缺点?

答案

优点

  • 高并发处理能力
  • 开发效率高,前后端使用同一种语言
  • 活跃的社区和丰富的模块
  • 适合 I/O 密集型应用
  • 部署简单,启动快速

缺点

  • 不适合 CPU 密集型任务
  • 单线程模型,一个错误可能导致整个进程崩溃
  • 回调地狱问题(可以通过 Promise/async-await 解决)
  • 类型安全较弱(可以使用 TypeScript 改善)

4. CommonJS 和 ES Module 的区别

问题:CommonJS 和 ES Module 有什么区别?

答案

特性CommonJSES Module
语法require/module.exportsimport/export
加载方式运行时同步加载编译时静态加载
加载时机运行时动态加载编译时确定依赖
循环依赖支持,但可能有问题支持,有更好的处理
使用方式Node.js 默认需要 .mjs 或 type: module
顶级 await不支持支持

5. Node.js 的全局对象

问题:Node.js 中有哪些重要的全局对象?

答案

全局对象

  • global:全局命名空间对象
  • process:当前进程信息
  • Buffer:二进制数据处理
  • console:控制台输出
  • __dirname:当前文件所在目录
  • __filename:当前文件路径
  • setTimeout/setInterval:定时器

process 对象常用属性

javascript
process.argv    // 命令行参数
process.env     // 环境变量
process.pid     // 进程 ID
process.cwd()   // 当前工作目录
process.exit()  // 退出进程

6. Node.js 的模块加载机制

问题:Node.js 是如何加载模块的?

答案

模块加载流程

  1. 路径分析:确定模块路径
  2. 文件定位:查找具体的文件
  3. 编译执行:编译并执行模块代码

模块查找顺序

  1. 核心模块(如 fs、http)
  2. 相对路径模块(以 ./ 或 ../ 开头)
  3. 绝对路径模块
  4. 第三方模块(从 node_modules 查找)

文件扩展名查找顺序

  1. .js
  2. .json
  3. .node
  4. 目录(查找 package.json 的 main 字段或 index.js)

7. package.json 的作用

问题:package.json 文件有什么作用?

答案

主要作用

  • 项目描述:名称、版本、描述、作者等信息
  • 依赖管理:dependencies、devDependencies
  • 脚本命令:scripts 字段定义命令
  • 入口文件:main 字段指定入口
  • 模块类型:type 字段指定模块系统
  • 引擎要求:engines 字段指定 Node.js 版本

常用字段

json
{
  "name": "my-project",
  "version": "1.0.0",
  "main": "index.js",
  "type": "module",
  "scripts": {
    "start": "node index.js",
    "test": "jest"
  },
  "dependencies": {
    "express": "^4.18.0"
  },
  "devDependencies": {
    "nodemon": "^2.0.0"
  }
}

8. npm 和 yarn 的区别

问题:npm 和 yarn 有什么区别?

答案

特性npmyarn
安装速度较慢较快(并行下载)
锁定文件package-lock.jsonyarn.lock
安全性需要额外配置默认更安全
离线模式不支持支持
工作区支持原生支持更好

常用命令对比

bash
# 安装依赖
npm install       # yarn
yarn install      # yarn

# 添加依赖
npm install express    # yarn add express
npm install -D jest    # yarn add -D jest

# 运行脚本
npm run start     # yarn start
npm run test      # yarn test

9. Node.js 的错误处理

问题:Node.js 中有哪些错误处理方式?

答案

错误处理方式

  1. try-catch:同步代码错误处理
javascript
try {
  const data = fs.readFileSync('file.txt');
} catch (err) {
  console.error('读取文件失败:', err.message);
}
  1. 错误回调:异步回调错误处理
javascript
fs.readFile('file.txt', (err, data) => {
  if (err) {
    console.error('读取文件失败:', err.message);
    return;
  }
  console.log(data);
});
  1. Promise catch:Promise 错误处理
javascript
readFilePromise('file.txt')
  .then(data => console.log(data))
  .catch(err => console.error('读取文件失败:', err.message));
  1. async/await + try-catch:现代异步错误处理
javascript
async function readData() {
  try {
    const data = await readFilePromise('file.txt');
    console.log(data);
  } catch (err) {
    console.error('读取文件失败:', err.message);
  }
}
  1. process.on('uncaughtException'):捕获未处理的异常
javascript
process.on('uncaughtException', (err) => {
  console.error('未捕获的异常:', err.message);
  process.exit(1);
});
  1. process.on('unhandledRejection'):捕获未处理的 Promise 拒绝
javascript
process.on('unhandledRejection', (reason, promise) => {
  console.error('未处理的 Promise 拒绝:', reason);
});

10. Node.js 的调试方法

问题:Node.js 有哪些调试方法?

答案

调试方法

  1. console.log:最简单的调试方式
javascript
console.log('调试信息:', variable);
console.dir(object, { depth: null }); // 深度打印对象
  1. debugger 语句:使用 Chrome DevTools
javascript
function test() {
  const a = 1;
  debugger; // 在此处设置断点
  const b = 2;
  return a + b;
}
// 运行:node inspect script.js
  1. node --inspect:启用调试模式
bash
node --inspect-brk=9229 index.js
# 然后在 Chrome 中访问 chrome://inspect
  1. VS Code 调试:配置 launch.json
json
{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "node",
      "request": "launch",
      "name": "启动程序",
      "program": "${workspaceFolder}/index.js"
    }
  ]
}
  1. ndb:Google 开发的 Node.js 调试工具
bash
npx ndb index.js