如何创建兼具获取全部用户与单个用户功能的统一API?
合并获取全部用户与单个用户的API实现方案
你可以通过将路由参数设置为可选,并在处理逻辑中根据参数是否存在分支执行查询,实现单接口兼具两种功能。以下是具体实现:
合并后的API代码
router.get('/:id?', async (req, res) => { try { let result; // 判断是否传入用户ID if (req.params.id) { result = await User.findById(req.params.id).select('-password'); if (!result) { return res.status(404).json({ success: false, message: '指定ID的用户不存在' }); } } else { result = await User.find().select('-password'); if (!result) { return res.status(500).json({ success: false, message: '获取用户列表失败' }); } } res.status(200).json({ success: true, data: result }); } catch (error) { // 捕获数据库查询或其他异步错误 res.status(500).json({ success: false, message: '服务器内部错误', error: error.message }); } });
关键说明
- 可选路由参数:使用
/:id?将id设为可选参数,同一个路由既可以匹配/(无参数)也可以匹配/123(带ID参数)。 - 分支逻辑:通过
req.params.id是否存在,决定执行单个用户查询还是全部用户查询。 - 错误处理优化:添加
try-catch捕获异步操作异常,避免服务器崩溃;同时区分用户不存在(404)和服务器内部错误(500)的状态码,符合REST规范。 - 统一响应格式:返回包含
success状态、message提示和data数据的JSON结构,前端处理更统一。
原代码问题修复
原代码存在两个潜在问题:
- 未捕获
await可能抛出的数据库异常,会导致服务器崩溃。 - 用户不存在时返回500状态码不符合REST规范,应使用404表示资源未找到。
合并后的代码解决了这些问题,同时满足你的需求。
内容的提问来源于stack exchange,提问作者Somasekhar
相关产品推荐
相关产品推荐

