标准逻辑应用Service Bus Trigger自定义跟踪ID表达式无消息时报错求助
我使用带有共享Service Bus触发器的标准逻辑应用,触发器类型为「当主题订阅中收到消息时(自动完成)」。我在触发器的「设置->跟踪」下的自定义跟踪ID中使用了以下表达式:
@{triggerBody()?['Properties']?['clientTrackingId']}
当有有效消息时,该表达式可以正常工作;但没有消息时,触发器每次轮询检查Service Bus是否有消息都会抛出异常:
无法处理触发器“When_a_message_is_received_in_get-survey-responses”的模板语言表达式(第1行,第8804列):“模板语言表达式'triggerBody()?['Properties']?['clientTrackingId']'无法求值,因为无法选择属性'Properties'。不支持对String类型的值进行属性选择。”
我尝试过表达式 @{coalesce(triggerBody()?['Properties']?['clientTrackingId'], workflow().run.name)},但没有效果,希望能得到一个不会引发异常的等效表达式。
可以通过先判断triggerBody()的类型,再决定是否访问属性的方式避免异常,使用isObject函数结合if条件判断来实现:
@{if(isObject(triggerBody()), triggerBody()?['Properties']?['clientTrackingId'], workflow().run.name)}
这个表达式的逻辑是:如果triggerBody()是对象类型(即存在有效消息时),则尝试获取clientTrackingId;如果不是对象类型(即轮询无消息时),则使用工作流的运行名称作为跟踪ID,这样就能避免非对象类型下的属性选择异常。
如果需要更严谨的判断,还可以同时检查Properties属性是否存在:
@{if(and(isObject(triggerBody()), contains(triggerBody(), 'Properties')), triggerBody()?['Properties']?['clientTrackingId'], workflow().run.name)}
内容的提问来源于stack exchange,提问作者user195166

