常见面试题
约 820 字大约 3 分钟
2025-06-11
基础概念类
Koa 和 Express 的主要区别是什么?
- Koa 使用 async/await 处理异步,Express 使用回调
- Koa 采用洋葱圈中间件模型,Express 是线性执行
- Koa 更轻量,不捆绑任何中间件
- Koa 的 Context 封装了 request/response 对象
解释 Koa 的洋葱圈模型
- 中间件像洋葱一样层层包裹,请求从外向内传递,响应从内向外返回
- 每个中间件执行两次:进入时和离开时(await next()前后)
Koa 的 Context 对象是什么?
- 封装了 Node 的 request 和 response 对象
- 提供了许多有用的方法简化 API 开发
- 作为中间件的第一个参数 ctx 传递
中间件相关
如何编写一个 Koa 中间件?
async function logger(ctx, next) { const start = Date.now(); await next(); // 调用下游中间件 const ms = Date.now() - start; console.log(`${ctx.method} ${ctx.url} - ${ms}ms`); } app.use(logger);
Koa 中间件的执行顺序是怎样的?
- 按照 app.use() 的顺序执行
- 遇到 await next() 会暂停当前中间件,执行下一个
- 最后一个中间件执行完后会逆序执行 await next() 之后的代码
如何处理 Koa 中的错误?
- 使用 try/catch 捕获异步错误
- 或者添加错误处理中间件:
app.use(async (ctx, next) => { try { await next(); } catch (err) { ctx.status = err.status || 500; ctx.body = { error: err.message }; } });
实战应用类
如何在 Koa 中实现路由?
- 使用 koa-router 中间件:
const Router = require("koa-router"); const router = new Router(); router.get("/", (ctx) => { ctx.body = "Home Page"; }); app.use(router.routes());
如何解析 POST 请求的 body?
- 使用 koa-bodyparser:
const bodyParser = require("koa-bodyparser"); app.use(bodyParser()); app.use(async (ctx) => { console.log(ctx.request.body); // 解析后的 body });
Koa 如何支持静态文件服务?
- 使用 koa-static:
const serve = require("koa-static"); app.use(serve("public")); // 服务 public 目录
高级问题
Koa 的源码核心是什么?如何实现一个简易版 Koa?
- 核心:中间件组合(koa-compose)、context 封装、request/response 代理
- 简易实现:
class SimpleKoa { constructor() { this.middlewares = []; } use(fn) { this.middlewares.push(fn); } listen(port) { require("http").createServer(this.callback()).listen(port); } callback() { return (req, res) => { const ctx = { req, res }; this.compose(this.middlewares)(ctx); }; } compose(middlewares) { return (ctx) => { const dispatch = (i) => { const fn = middlewares[i]; if (!fn) return Promise.resolve(); return Promise.resolve(fn(ctx, () => dispatch(i + 1))); }; return dispatch(0); }; } }
Koa 和 Express 的性能对比如何?
- 在简单场景下性能相近
- 复杂中间件场景 Koa 可能更优,因为基于 Promise
- 实际性能差异通常不大,选择取决于开发体验需求
如何优化 Koa 应用的性能?
- 使用高效中间件
- 合理组织中间件顺序
- 启用 gzip 压缩
- 使用集群模式(cluster)
- 合理使用缓存
Koa 如何支持 WebSocket?
- 使用 koa-websocket 或独立的 ws 库
- 示例:
const WebSocket = require("ws"); const server = app.listen(3000); const wss = new WebSocket.Server({ server }); wss.on("connection", (ws) => { ws.on("message", (message) => { console.log("received: %s", message); }); ws.send("something"); });
Koa 如何实现 JWT 认证?
- 使用 koa-jwt 中间件:
const jwt = require("koa-jwt"); app.use(jwt({ secret: "shared-secret" }).unless({ path: [/^\/public/] }));
Koa 如何实现文件上传?
- 使用 koa-body 中间件:
const koaBody = require("koa-body"); app.use( koaBody({ multipart: true, formidable: { uploadDir: "./uploads", }, }) ); app.use(async (ctx) => { console.log(ctx.request.files); // 上传的文件 });
准备 Koa 面试时,除了理解这些概念,最好能准备一些实际项目经验,解释你如何使用 Koa 解决具体问题,这会大大增加面试成功率。
更新日志
2025/8/24 08:17
查看所有更新日志
e7112
-1于