Express框架下如何将GetByUserID改写为符合关注点分离的回调函数
改写方案
核心思路
拆分Service层和路由层的职责边界,Service层只负责处理数据查询等核心业务逻辑,不耦合HTTP请求/响应对象,查询结果通过回调传递给路由层,由路由层处理参数提取、HTTP响应封装等请求相关逻辑。
改写后的代码
Userservice.js
function getByUserId(userID, callback) { User.findOne({ userID: userID }, function(err, result) { if (err) { console.log("error: " + err) // 把错误透传给回调 return callback(err, null) } console.log("Awesome.") // 把查询结果透传给回调 callback(null, result) }) } // 导出Service方法 module.exports = { getByUserId }
UserRoute.js
router.post('/publicUser/getByUserID', function(req, res, next) { // 路由层负责提取请求参数 const userID = req.body.userID // 调用Service层方法,传入业务参数和回调函数处理结果 userService.getByUserId(userID, function(err, userResult) { if (err) { // 路由层负责处理HTTP错误响应 return res.status(500).send('用户查询失败') } // 路由层负责处理正常HTTP响应 res.send(userResult) }) })
改动说明
- 解除了Service层与HTTP层的耦合:Service方法不再接收
req/res对象,仅接收业务参数,逻辑更纯粹,可在非HTTP场景直接复用。 - 职责边界清晰:路由层负责解析请求参数、封装响应内容、适配HTTP错误状态,Service层仅负责数据库查询等核心业务逻辑,完全符合关注点分离原则。
- 通过回调实现结果异步传递:Service层完成业务操作后,通过传入的回调函数将错误和结果返回给调用方,后续处理逻辑完全由调用方按需实现。
内容的提问来源于stack exchange,提问作者user17161243
相关产品推荐
相关产品推荐

