MuleSoft DataWeave中Filter函数在Reduce场景下失效问题排查
问题分析
你遇到的核心问题是:当数组元素是没有message键的空对象时,直接访问$.message会触发DataWeave的缺失必填键错误,导致filter逻辑还没执行就终止了,所以看起来filter没生效。
解决方案
要解决这个问题,需要先安全判断对象是否包含message键,或者使用安全导航操作符避免访问不存在的键时报错。下面是两种可行的修正方案:
方案1:使用containsKey判断键是否存在
修改filter条件,先检查对象是否包含message键,再判断其值不为null:
var va = [{ message: "hallo" }, { message: "Error on Employee Number " }, { } ] var filterOutEmptyValues = va filter ($ != null and ($ containsKey "message" and $.message != null)) output application/json --- [{"message" : trim((filterOutEmptyValues reduce ((item, acc = "") -> acc ++ item.message ++ " ")))}]
方案2:使用安全导航操作符?
安全导航操作符?会在键不存在时返回null,而不是抛出错误,这样就能正常执行filter判断:
var va = [{ message: "hallo" }, { message: "Error on Employee Number " }, { } ] var filterOutEmptyValues = va filter ($ != null and $.message? != null) output application/json --- [{"message" : trim((filterOutEmptyValues reduce ((item, acc = "") -> acc ++ item.message ++ " ")))}]
额外优化
如果只是要合并message值,其实可以用joinBy函数简化reduce逻辑,代码更简洁:
var va = [{ message: "hallo" }, { message: "Error on Employee Number " }, { } ] var validMessages = va filter ($ != null and $.message? != null) map $.message output application/json --- [{"message": trim(validMessages joinBy " ")}]
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

