Skip to content

第15章:Node.js 高频面试题(新手必备)

15.1 基础概念题(Node.js定义、核心优势、与浏览器JS的区别)

1. 什么是Node.js?

答案:Node.js是一个基于Chrome V8引擎的JavaScript运行环境,允许在服务器端运行JavaScript代码。

2. Node.js的核心优势是什么?

答案

  • 非阻塞I/O:处理并发请求时性能更高
  • 事件驱动:基于事件循环机制,响应速度快
  • 跨平台:可以在Windows、Mac、Linux等平台运行
  • 单线程:避免了多线程的复杂性
  • 丰富的生态系统:npm包管理器提供了大量第三方模块

3. Node.js与浏览器JavaScript的区别?

答案

  • 运行环境:Node.js运行在服务器端,浏览器JavaScript运行在浏览器中
  • 全局对象:Node.js中是global,浏览器中是window
  • 内置模块:Node.js提供了fs、path、http等核心模块,浏览器没有
  • 权限:Node.js可以访问文件系统、网络等系统资源,浏览器有严格的安全限制
  • 模块系统:Node.js使用CommonJS模块化规范,浏览器使用ES6模块化规范

15.2 核心机制题(事件循环、非阻塞I/O、模块化规范)

4. 什么是Node.js的事件循环?

答案:事件循环是Node.js处理异步操作的机制,它会不断从事件队列中取出事件并执行相应的回调函数。事件循环分为多个阶段,包括定时器阶段、I/O回调阶段、闲置阶段、轮询阶段、检查阶段和关闭回调阶段。

5. 什么是非阻塞I/O?

答案:非阻塞I/O是指在执行I/O操作时,不会阻塞主线程,而是将操作交给底层系统处理,当操作完成后通过回调函数通知主线程。这样主线程可以继续处理其他任务,提高了系统的并发处理能力。

6. Node.js的模块化规范有哪些?

答案

  • CommonJS:Node.js默认使用的模块化规范,使用require()导入模块,module.exports导出模块
  • ES6模块:使用import导入模块,export导出模块,需要在package.json中设置"type": "module"

7. 模块查找机制是怎样的?

答案:当使用require()导入模块时,Node.js会按照以下顺序查找:

  1. 核心模块(如fs、path等)
  2. 相对路径或绝对路径的模块
  3. node_modules目录中的模块
  4. 向上级目录的node_modules查找,直到根目录

15.3 实战场景题(创建服务器、接口开发、文件操作)

8. 如何使用Node.js创建一个简单的HTTP服务器?

答案

javascript
const http = require('http');

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World\n');
});

server.listen(3000, '127.0.0.1', () => {
  console.log('Server running at http://127.0.0.1:3000/');
});

9. 如何处理POST请求的参数?

答案

javascript
const http = require('http');
const querystring = require('querystring');

const server = http.createServer((req, res) => {
  if (req.method === 'POST') {
    let body = '';
    req.on('data', chunk => {
      body += chunk.toString();
    });
    req.on('end', () => {
      const postData = querystring.parse(body);
      console.log(postData);
      res.end('POST request received');
    });
  }
});

server.listen(3000);

10. 如何使用fs模块读取文件?

答案

javascript
const fs = require('fs');

// 异步读取
fs.readFile('file.txt', 'utf8', (err, data) => {
  if (err) throw err;
  console.log(data);
});

// 同步读取
const data = fs.readFileSync('file.txt', 'utf8');
console.log(data);

11. 如何使用Express框架创建路由?

答案

javascript
const express = require('express');
const app = express();

// GET路由
app.get('/', (req, res) => {
  res.send('Hello Express');
});

// POST路由
app.post('/api/users', (req, res) => {
  res.json({ message: 'User created' });
});

app.listen(3000);

15.4 易错点题(异步代码执行顺序、模块导入、跨域问题)

12. 下面代码的执行顺序是什么?

javascript
console.log('1');

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

console.log('3');

答案:执行顺序是1 -> 3 -> 2。因为setTimeout是异步操作,会被放入事件队列,等主线程执行完毕后再执行。

13. 模块导入时出现"Cannot find module"错误的原因有哪些?

答案

  • 模块未安装
  • 导入路径错误
  • 文件名大小写不匹配
  • 模块导出方式错误

14. 如何解决跨域问题?

答案

  • 使用CORS中间件:npm install cors,然后在Express中使用app.use(cors())
  • 手动设置CORS头:res.setHeader('Access-Control-Allow-Origin', '*')
  • 使用代理服务器

15.5 框架相关题(Express中间件、核心用法)

15. 什么是Express中间件?

答案:中间件是在请求和响应之间执行的函数,用于处理请求、修改请求/响应对象、调用下一个中间件等。中间件可以用于日志记录、权限验证、错误处理等功能。

16. 如何创建和使用中间件?

答案

javascript
// 创建中间件
const logger = (req, res, next) => {
  console.log(`${req.method} ${req.url}`);
  next(); // 调用下一个中间件
};

// 使用中间件
app.use(logger);

// 路由级中间件
app.get('/api/users', authMiddleware, (req, res) => {
  res.json(users);
});

17. Express中如何处理静态资源?

答案

javascript
app.use(express.static('public'));
// 访问 http://localhost:3000/images/logo.png 会加载 public/images/logo.png

15.6 面试技巧(新手如何快速记忆核心知识点,应对提问)

18. 如何快速记忆Node.js核心知识点?

答案

  • 理解核心概念:事件循环、非阻塞I/O、模块化
  • 掌握常用API:fs、http、express等
  • 多做实战项目:通过实践巩固知识
  • 总结常见问题:整理易错点和解决方案
  • 制作思维导图:将知识点系统化

19. 面试时如何应对自己不熟悉的问题?

答案

  • 诚实承认:"这个问题我目前不太熟悉"
  • 表达学习意愿:"但我会在后续学习中重点关注这方面"
  • 关联已知知识:尝试从已知知识点中寻找关联
  • 保持积极态度:展示学习能力和解决问题的思路

20. 如何准备Node.js面试?

答案

  • 复习核心概念:事件循环、异步编程、模块化
  • 练习常见题目:创建服务器、处理请求、文件操作
  • 了解框架使用:Express、Koa等
  • 准备项目案例:描述自己做过的Node.js项目
  • 关注最新趋势:了解Node.js的新特性和最佳实践

© 2026 编程马·菜鸟教程 版权所有