JavaScript 的 class 本身不实现路由控制器,但可封装处理逻辑:定义控制器类提供 index、show 等方法,接收 req/res,通过 bind 或箭头函数绑定 this,实例化后挂载到路由;支持装饰器模拟和前端 SPA 应用。

JavaScript 中 class 语法本身不直接实现路由控制器,但它非常适合用来组织和封装路由处理逻辑——关键在于把 class 当作“控制器类”,配合路由库(如 Express、Koa、或前端框架的 router)来实例化和绑定方法。
用 class 定义控制器行为
控制器 class 通常不负责监听 URL,而是提供清晰的处理方法(如 index、show、create),每个方法接收标准的请求/响应对象(或上下文)。
- 方法保持无状态,只处理业务逻辑,不直接操作路由注册
- 推荐使用箭头函数绑定 this(或在构造时绑定),避免方法被单独调用时丢失上下文
- 可复用:同一控制器实例可挂载到多个路由路径
示例(Express 风格):
class UserController {
constructor(userService) {
this.userService = userService;
// 绑定方法,确保 this 指向正确
this.index = this.index.bind(this);
this.show = this.show.bind(this);
}
async index(req, res) {
const users = await this.userService.findAll();
res.json(users);
}
async show(req, res) {
const user = await this.userService.findById(req.params.id);
if (!user) return res.status(404).end();
res.json(user);
}
}
// 使用时实例化并挂载
const userController = new UserController(new UserService());
app.get('/users', userController.index);
app.get('/users/:id', userController.show);
结合中间件与装饰器(进阶写法)
若想更贴近“声明式路由控制器”体验(类似 NestJS),可用简单装饰器模拟元数据标记,再配合注册函数自动绑定。虽然 JavaScript 原生不支持装饰器(需 Babel 或 TypeScript),但可手动模拟逻辑:
立即学习“Java免费学习笔记(深入)”;
- 给 class 方法添加自定义属性(如
route.method = 'GET'、route.path = '/users') - 写一个
registerController(router, controllerInstance)函数,遍历其方法,按标记自动挂载 - 适合中大型项目统一管理路由入口,减少重复
app.get(...)
前端单页应用(SPA)中的类控制器
在前端(如用原生 JS 或轻量框架),class 同样适用:将路由匹配结果交给控制器方法处理,再更新视图。
- 监听
popstate或使用URLPattern匹配路径 - 控制器 class 负责加载数据、渲染模板、管理局部状态
- 例如:
router.on('/posts', () => postController.renderList())
注意事项
避免常见误区:
- 不要在 class 构造函数里执行异步初始化并期望立即可用(如未 await 就挂载路由)
- 不要让控制器直接耦合 DOM 操作(前端)或数据库连接(后端)——通过依赖注入解耦
- 错误处理建议统一由上层中间件捕获(如 Express 的 error-handling middleware),控制器内只需 throw



















