You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 10:54:03