Node.js 依赖于少数几种契合其 module system、异步模型和流式 I/O 的设计模式。每个后端开发者都应认得的最常见的那些:
module.exports / export 暴露一个公共 API,将内部实现保持私有。这是 Node 中代码组织的基础。// db.js — 每次 `require("./db")` 都得到同一个 pool(通过 module cache 实现的 singleton)。
const pool = createPool(process.env.DATABASE_URL);
module.exports = pool;
function createLogger(kind) {
return kind === "json" ? new JsonLogger() : new TextLogger();
}
EventEmitter、streams 以及大多数 core module 都使用它。const { EventEmitter } = require("node:events");
const bus = new EventEmitter();
bus.on("order:paid", (o) => sendReceipt(o));
bus.emit("order:paid", order);
(ctx, next),被 Express/Koa 发扬光大。非常适合横切关注点(auth、logging、validation)。app.use((req, res, next) => { req.startedAt = Date.now(); next(); });
const { pipeline } = require("node:stream/promises");
await pipeline(fs.createReadStream("in"), gzip(), fs.createWriteStream("out.gz"));
| 需求 | 模式 |
|---|---|
| 一个共享资源 | Singleton (module cache) |
构建 object、隐藏 new | Factory |
| 对异步 event 作出反应 | Observer / EventEmitter |
| 横切的 request 逻辑 | Middleware |
| 安全处理大数据 | Streams / pipeline |
| 可测试、解耦的依赖 | Dependency Injection |
模式是一套共享的词汇:说"config 是一个 module 缓存的 singleton"或"auth 是 middleware",几个词就传达了一种设计。Node 自身的 core(EventEmitter、streams、module system)就是用这些模式构建的,因此认得它们能帮你读懂框架并组织自己的 service。面试官用这个问题来检验你不是随手临时拼接 callback,而是伸手去拿契合的那个模式——并了解它的取舍,比如 singleton 会让全局状态更难测试。
一个包含详细解答的 IT 面试题库——从初级到高级。
捐赠