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

如何编写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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:41:23