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

如何优雅重构Couchbase文档更新逻辑以兼顾外部调用与内部复用?

优雅重构方案:分离业务逻辑与HTTP适配

核心思路是把耦合HTTP请求响应的逻辑和纯业务更新逻辑拆分开,让业务逻辑函数可以独立复用,HTTP层只做参数解析和响应封装。

1. 提取纯业务逻辑函数

这个函数不依赖req/res,只负责和Couchbase交互完成文档更新,返回Promise(成功时返回更新后的文档,失败时抛出带状态码的自定义错误):

// 纯业务逻辑:仅处理文档更新,可内部复用
export const updateDocumentById = async (documentId, newProductId) => {
  try {
    // 获取目标文档
    const result = await collection.get(documentId);
    const document = result.value;
    
    // 更新product_id字段(优先使用传入的新值,无新值则保留原值)
    document.product_id = newProductId || document.product_id;
    
    // 执行更新操作
    await collection.replace(documentId, document);
    
    return document;
  } catch (err) {
    // 根据Couchbase错误类型封装自定义错误,带上对应HTTP状态码
    if (err.code === 13 || err.message.includes('not found')) { // 对应文档不存在的错误码/信息
      const notFoundErr = new Error('目标文档不存在');
      notFoundErr.statusCode = 404;
      throw notFoundErr;
    }
    
    const updateErr = new Error('文档更新失败');
    updateErr.statusCode = 500;
    updateErr.innerError = err; // 保留原始错误用于排查
    throw updateErr;
  }
};

2. 适配HTTP接口

原来的PUT接口只需要调用纯逻辑函数,处理请求参数和响应即可:

// HTTP接口层:仅处理req/res参数解析与响应
databaseRouter.put('/update/:id', async (req, res) => {
  try {
    const updatedDoc = await updateDocumentById(req.params.id, req.body.id);
    res.json(updatedDoc);
  } catch (err) {
    // 根据自定义错误的状态码返回对应HTTP响应
    const status = err.statusCode || 500;
    res.status(status).send(err.message || '服务器内部错误');
    console.error('更新接口错误:', err.innerError || err);
  }
});

3. 内部批量处理场景复用

在项目内部(比如批量任务、定时脚本),直接调用纯逻辑函数即可,灵活处理结果和错误:

// 内部批量更新示例
export const batchUpdateDocuments = async (documentIds, targetProductId) => {
  // 并行处理所有更新请求
  const updateResults = await Promise.all(
    documentIds.map(async (id) => {
      try {
        const doc = await updateDocumentById(id, targetProductId);
        return { id, success: true, data: doc };
      } catch (err) {
        // 批量场景下可单独记录错误,不中断整个任务
        console.error(`批量更新失败 [ID: ${id}]:`, err);
        return { id, success: false, error: err.message };
      }
    })
  );
  
  return updateResults;
};

方案优势

  • 职责清晰:业务逻辑和HTTP适配完全分离,代码更易维护和测试。
  • 复用性高:纯逻辑函数可以在任何非HTTP场景(批量任务、内部服务调用)直接使用。
  • 错误处理统一:通过自定义错误携带状态码,HTTP层和内部场景都能清晰处理不同错误类型。
  • 代码简洁:用async/await替代回调嵌套,可读性和可调试性大幅提升。

内容的提问来源于stack exchange,提问作者kar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 11:55:39