nodejs 语言特性(面试系列2)
Node.js 核心模块
1. HTTP 模块
- 常见问题:
- 如何创建简单的 HTTP 服务器?
const http = require('http'); const server = http.createServer((req, res) => {res.writeHead(200, { 'Content-Type': 'text/plain' });res.end('Hello World!'); }); server.listen(3000);
何处理请求参数(URL 参数、POST 数据)?
- URL 参数:
url.parse(req.url, true).query
。- POST 数据:监听
data
和end
事件,通过Buffer
拼接。
2.文件系统(fs 模块)
- 同步 vs. 异步操作:
- 同步:
fs.readFileSync()
,阻塞线程。- 异步:
fs.readFile()
,非阻塞(推荐)。- 流式操作
const fs = require('fs'); const readStream = fs.createReadStream('large.txt'); readStream.on('data', (chunk) => { /* 处理数据块 */ });
3.Buffer
- 作用:处理二进制数据(如文件读写、网络请求)。
- 常见操作
const buf = Buffer.from('hello', 'utf8'); console.log(buf.toString('hex')); // 68656c6c6f
性能优化与调试
1. 内存泄漏排查
- 常见原因:
- 未清理的定时器(如
setInterval
)。- 闭包引用(如事件监听器未移除)。
- 工具:
heapdump
:生成堆快照,分析内存占用。node --inspect
:结合 Chrome DevTools 调试
2. 性能监控
- 常用工具:
pm2
:进程管理、自动重启、性能监控。New Relic
/AppDynamics
:应用性能监控(APM)。
集群模式(Cluster)
- 作用:利用多核 CPU,通过
child_process.fork()
创建子进程。- 实现
const cluster = require('cluster'); if (cluster.isMaster) {for (let i = 0; i < require('os').cpus().length; i++) {cluster.fork();} } else {// 子进程逻辑 }
框架与生态系统
1. Express/Koa
- Express:轻量级 Web 框架,路由灵活(如
app.get()
、app.post()
)。- Koa:Express 原班人马打造,基于
async/await
,中间件更简洁。- 中间件原理:洋葱模型(请求进入 → 中间件 1 → 中间件 2 → 响应 → 中间件 2 → 中间件 1)。
MongoDB 与 Node.js
- ODM 工具:
- Mongoose:Schema 设计、数据验证、虚拟字段。
const mongoose = require('mongoose'); const UserSchema = new mongoose.Schema({ name: String }); const User = mongoose.model('User', UserSchema);
3. WebSocket(Socket.io)
- 应用场景:实时通信(如聊天、弹幕、实时数据推送)。
- 与 HTTP 的区别:长连接,双向通信,基于 TCP。
工程实践与最佳实践
错误处理
- 全局错误捕获
process.on('uncaughtException', (err) => {console.error('未捕获的异常:', err);process.exit(1); // 可选:是否重启进程 });
安全问题
- 常见漏洞:
- XSS:通过
helmet
或DOMPurify
过滤输入。- CSRF:使用
csurf
中间件生成令牌。- SQL 注入:参数化查询(如
mysql2
的?
占位符)。
Docker 与 Node.js
- Dockerfile 示例
FROM node:18-alpine WORKDIR /app COPY package*.json ./ RUN npm ci COPY . . EXPOSE 3000 CMD ["node", "server.js"]