如何在Apache NiFi的JS脚本中替换Emp_Id值(禁用高级API)
在Apache NiFi Execute Script中用JavaScript处理数据(按Emp_Id拆分条目)
可行代码实现
// 从NiFi流文件读取输入数据 var s3Data = JSON.parse(session.read(flowFile).toString()); // 假设response数据已通过其他方式获取(比如API调用结果) var response = { data: [ ["EMP001", "John"], ["EMP002", "Jane"], ["EMP003", "Bob"] ] }; var result = []; // 核心处理逻辑 if (s3Data.Emp_Id === "All") { response.data.forEach(function(subArr) { // 手动复制原数据字段(不使用高级内置方法) var newRecord = {}; for (var key in s3Data) { if (s3Data.hasOwnProperty(key)) { newRecord[key] = key === "Emp_Id" ? subArr[0] : s3Data[key]; } } result.push(newRecord); }); } else { result.push(s3Data); } // 将处理结果写回流文件 flowFile = session.write(flowFile, function(outputStream) { outputStream.write(JSON.stringify(result).getBytes("UTF-8")); }); session.transfer(flowFile, REL_SUCCESS);
关键逻辑说明
- 字段复制:用
for-in循环配合hasOwnProperty遍历s3Data的所有自有字段,手动完成复制与Emp_Id替换,完全规避Object.assign、Object.fromEntries等受限方法。 - "All"场景处理:遍历
response.data的每个子数组,为每个子数组生成一条独立记录,Emp_Id替换为子数组第一个元素,其余字段完全保留原数据。 - 非"All"场景:直接将原记录加入结果数组,无需额外修改。
常见问题修正
如果你的代码未得到预期结果,大概率是以下问题:
- 未完整复制原字段:只手动赋值了部分字段,导致输出记录丢失数据,必须遍历所有键确保字段不遗漏。
- 忽略
hasOwnProperty:for-in会遍历对象原型链上的属性,加上该判断可避免引入意外的继承属性。 - NiFi上下文错误:忘记从flowFile读取输入数据,或未正确将结果写回流文件,导致数据未正常流转。
内容的提问来源于stack exchange,提问作者dash
相关产品推荐
相关产品推荐

