Appearance
第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会按照以下顺序查找:
- 核心模块(如fs、path等)
- 相对路径或绝对路径的模块
- node_modules目录中的模块
- 向上级目录的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.png15.6 面试技巧(新手如何快速记忆核心知识点,应对提问)
18. 如何快速记忆Node.js核心知识点?
答案:
- 理解核心概念:事件循环、非阻塞I/O、模块化
- 掌握常用API:fs、http、express等
- 多做实战项目:通过实践巩固知识
- 总结常见问题:整理易错点和解决方案
- 制作思维导图:将知识点系统化
19. 面试时如何应对自己不熟悉的问题?
答案:
- 诚实承认:"这个问题我目前不太熟悉"
- 表达学习意愿:"但我会在后续学习中重点关注这方面"
- 关联已知知识:尝试从已知知识点中寻找关联
- 保持积极态度:展示学习能力和解决问题的思路
20. 如何准备Node.js面试?
答案:
- 复习核心概念:事件循环、异步编程、模块化
- 练习常见题目:创建服务器、处理请求、文件操作
- 了解框架使用:Express、Koa等
- 准备项目案例:描述自己做过的Node.js项目
- 关注最新趋势:了解Node.js的新特性和最佳实践
