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
相关产品推荐
相关产品推荐

