在 RESTful API 的设计中,将登录和注册 API 放在 users 路由下并不是不可以,但有更清晰、更符合语义化规范的方式来组织这些路由。以下是一些业界常见的设计方案和规范建议:


1. 根据资源和动作分开路由

  • 用户的 CRUD 操作放在 /users 路由下。
  • 登录和注册属于认证和授权的功能,不直接操作用户资源,建议单独归为一类。

路由建议:

  • 用户相关(CRUD):
1
2
3
4
5
6

GET /api/v1/users - 获取用户列表
GET /api/v1/users/:id - 获取特定用户
POST /api/v1/users - 创建用户
PUT /api/v1/users/:id - 更新用户信息
DELETE /api/v1/users/:id - 删除用户
  • 认证相关(Auth):
1
2
3
4
POST   /api/v1/auth/register  - 用户注册
POST /api/v1/auth/login - 用户登录
POST /api/v1/auth/logout - 用户注销
POST /api/v1/auth/refresh - 刷新 Token

这样分开设计的好处:

  • 语义化更强/auth 路由明确了这是关于认证的。
  • 职责清晰users 负责用户资源的管理,auth 负责认证流程。

2. 控制器层的职责分离

你目前将登录和注册逻辑放在了 usersController 中,这是因为两者都涉及用户资源。但更好的做法是根据职责拆分控制器:

  • usersController 专注于用户资源的 CRUD 操作。
  • authController 专注于登录、注册等认证逻辑。

示例代码结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

// routes/authRoutes.js
const express = require('express');
const { login, register } = require('../controllers/authController');
const router = express.Router();

router.post('/login', login);
router.post('/register', register);

module.exports = router;

// routes/userRoutes.js
const express = require('express');
const { getAllUsers, getUserById, updateUser, deleteUser } = require('../controllers/usersController');
const router = express.Router();

router.get('/', getAllUsers);
router.get('/:id', getUserById);
router.put('/:id', updateUser);
router.delete('/:id', deleteUser);

module.exports = router;

3. 实际使用案例

在许多成熟的项目或框架中,这种分离方式是主流:

  • Node.js 社区(如 Express 应用程序模板):通常将 authusers 拆分成不同模块。
  • 大型开源项目(如 Laravel、Django、Spring):同样将认证逻辑与资源逻辑分离。

总结建议

  • 使用 /api/v1/auth/login/api/v1/auth/register 作为登录和注册的路由。
  • 将认证逻辑(如登录、注册)移入 authController,用户资源管理逻辑保留在 usersController
  • 在项目结构中保持模块化和职责分离,便于扩展和维护。

这样设计符合业界规范,同时对未来添加更多认证功能(如密码重置、OAuth 登录)也更加友好。