如何编写Express函数:既支持API返回JSON又可内部调用?
嘿,这个问题其实很好解决!核心思路就是把和Salesforce交互的核心业务逻辑从API控制器的HTTP处理代码里抽离出来,做成一个独立的可复用函数。这样一来,不管是对外提供JSON API,还是内部代码直接调用,都能复用同一段逻辑,完全不需要用Axios/Fetch走HTTP请求。
下面是具体的实现步骤:
1. 抽离核心业务函数
首先,把连接Salesforce、查询工单号名称的逻辑单独放到一个服务模块里(比如services/salesforce.js),做成一个返回Promise的异步函数:
// services/salesforce.js async function getJobNameByQ(jobId) { // 这里替换成你实际的Salesforce连接逻辑 const conn = await connectToSalesforce(); // 假设这是你的连接函数 try { // 执行查询,替换成你实际的SOQL语句 const queryResult = await conn.query(` SELECT Name FROM Job__c WHERE Id = '${jobId}' `); // 处理查询结果 if (queryResult.records.length > 0) { return { name: queryResult.records[0].Name }; } else { return { name: null }; // 或者根据需求抛出错误 } } catch (error) { console.error('Salesforce查询失败:', error); throw error; // 抛出错误让调用方处理 } } // 导出函数供外部调用 module.exports = { getJobNameByQ };
2. 更新API控制器,复用业务函数
原来的API控制器现在只需要处理HTTP请求的参数解析、响应返回,核心逻辑直接调用上面的函数:
// controllers/jobController.js const { getJobNameByQ } = require('../services/salesforce'); exports.lookupJobName = async (req, res) => { try { // 解析并验证查询参数Q const q = parseInt(req.query.Q); if (isNaN(q)) { return res.status(400).json({ error: '参数Q必须是有效数字' }); } // 调用核心业务函数 const oppName = await getJobNameByQ(q); res.json(oppName); } catch (error) { // 统一处理错误,返回HTTP 500响应 res.status(500).json({ error: '查询工单号名称失败' }); } };
3. 内部代码直接调用
在其他需要获取工单号名称的地方,直接导入业务函数调用即可,完全不需要走HTTP请求:
// 比如在另一个业务模块或路由里 const { getJobNameByQ } = require('../services/salesforce'); async function someInternalBusinessLogic() { try { // 直接传参数调用,得到结果 const jobName = await getJobNameByQ(123456); // 直接使用结果,无需解析JSON console.log('内部调用获取到的工单号名称:', jobName.name); // 这里可以继续处理业务逻辑... } catch (error) { // 内部调用时自行处理错误 console.error('内部调用查询失败:', error); } }
额外注意点
- 错误处理:业务函数抛出错误,API控制器和内部调用方可以各自根据场景处理错误(API返回HTTP错误码,内部调用做业务回滚或提示)。
- 连接优化:如果Salesforce连接开销大,可以考虑用单例模式或连接池,避免每次调用都重新建立连接。
- 参数验证:可以把参数验证逻辑也抽成公共函数,确保API调用和内部调用的参数一致性。
内容的提问来源于stack exchange,提问作者McB
相关产品推荐
相关产品推荐

