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

Node.js单任务更新服务改多任务失败:单次API无法批量更新taskNumber

Node.js批量更新任务编号API修复方案

原代码存在几个问题导致批量更新功能无法正常工作,以下是修复后的代码及关键修改说明:

const updateRFC = async (request, response) => {
  const { CONTENT_TYPE, ITSM_CONST } = constants;
  const { APIGEE_HOST } = ITSM_CONST;
  const correlationId = request.headers['x-correlation-id'];
  logger.trace('operations-util :: itsm-tool :: changes :: standardChangeRequest :: createStandardRFC :: Method Entry', correlationId);

  // 禁用TLS证书校验,仅建议测试环境使用,生产环境请移除
  process.env.NODE_TLS_REJECT_UNAUTHORIZED = 0;

  try {
    const ctaskDetails = request.body.metaInformation?.ctaskdetails;
    console.log("sowmya", ctaskDetails);

    // 校验输入格式,非数组直接返回错误
    if (!Array.isArray(ctaskDetails)) {
      throw new Error('ctaskdetails必须为数组格式,才能支持批量任务更新');
    }

    // 生成批量请求的Promise数组
    const taskPromises = ctaskDetails.map(async (task) => {
      const host = CONFIG.application.EPAAS_ENV.toLowerCase().includes('e3') 
        ? CONFIG.application.url['apigee-api-request-host'] 
        : APIGEE_HOST;
      const path = '/management/operations/v2/itsm/change_mgmt/changes/tasks/state';
      const port = CONFIG.application.url['apigee-api-request-port'];
      const method = 'PUT';
    
      const hmacOptions = {
        clientKey: '', // 请填入实际的clientKey
        clientSecret: '', // 请填入实际的clientSecret
        host,
        path,
        method,
        port,
      };

      const requestBody = JSON.stringify(task);
      const hmacAuthToken = hmacAuth.generateAuthHeader(hmacOptions, requestBody, correlationId);
      const options = {
        host,
        path,
        method,
        headers: {
          correlation_id: correlationId,
          'content-type': CONTENT_TYPE,
          'X-AMEX-API-KEY': hmacOptions.clientKey,
          Authorization: hmacAuthToken,
          service_id: CONFIG.application.VAULT.ITSM_SRE_API_SERVICE_ID,
        },
      };

      console.log("sowmya1", options);
      const result = await PromiseUtil.post(options, requestBody);
      console.log("result", result);
      return { taskNumber: task.taskNumber, result };
    });

    // 批量执行所有请求,等待全部任务完成(无论成功失败)
    const multiServiceEDCResult = await Promise.allSettled(taskPromises);
    console.log("multiServiceEDCResult", multiServiceEDCResult);

    // 格式化返回结果,便于客户端查看每个任务的处理状态
    const responseResult = multiServiceEDCResult.map((item, index) => {
      if (item.status === 'fulfilled') {
        return {
          task: ctaskDetails[index],
          result: item.value,
          status: 'success'
        };
      } else {
        return {
          task: ctaskDetails[index],
          error: item.reason.toString(),
          status: 'failed'
        };
      }
    });

    response.status(200).send(responseResult);
    logger.trace('operations-util :: itsm-tool :: changes :: standardChangeRequest :: createStandardRFC :: Method Exit', correlationId);
  } catch (error) {
    logger.warn(`operations-util :: itsm-tool :: changes :: standardChangeRequest :: createStandardRFC :: ${error.toString()}`, correlationId);
    response.status(400).send({ status: 400, message: error.toString() });
    logger.trace('operations-util :: itsm-tool :: changes :: standardChangeRequest :: createStandardRFC :: Method Exit', correlationId);
  }
};

关键修改点

  • 输入格式校验:新增数组格式判断,避免非数组输入导致后续代码报错;
  • 简化代码结构:移除冗余的rfcOptions函数,直接生成Promise数组,减少不必要的封装;
  • 优化配置逻辑:将禁用TLS证书校验的代码移到函数开头,避免循环内重复设置;
  • 返回结果优化:给每个任务的处理结果添加明确的成功/失败状态,便于客户端排查问题;
  • 修正日志路径:修复原代码中错误的日志退出路径,统一使用当前方法的日志标识;
  • 避免重复序列化:将JSON.stringify(task)抽离为变量,减少重复序列化操作;
  • 注意事项:代码中clientKey和clientSecret为空,需填入实际密钥信息,否则请求会鉴权失败;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 00:12:23