如何优雅重构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
相关产品推荐
相关产品推荐

