Как выполнить "нулевую" проверку действия условия "if" приложения Azure Logic

Я создал приложение логики, которое содержит некоторый триггер, "http" -коннектор и затем условие "If". Разъем 'http' возвращает результат 'json', скажем jsonObj,

Я могу проверить состояние как @equal(body('HTTP')['jsonObj'].someProperty,'someValue') но не в состоянии сделать null проверить это someProperty значение.

Ниже приведены некоторые способы, которые я пробовал, которые не работают.

@equal(body('HTTP')['jsonObj'].someProperty, null) --Unable to save
@equal(body('HTTP')['jsonObj']?.someProperty,'null') --Comparing with string value 'null'

4 ответа

Решение

Я не нашел реального способа напрямую протестировать против null или же undefined но следующий обходной путь должен работать при выборе достаточной "случайной" строки в качестве запасного варианта для coalesce

...
"propExists": "@equals(coalesce(triggerBody()?.prop, 'Fallback42'), 'Fallback42')"
...

Например, следующее приложение логики будет возвращать свойство prop и было ли это на самом деле указано или нет

{
    "$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#",
    "actions": {
        "Response": {
            "inputs": {
                "body": {
                    "propNull": "@equals(coalesce(triggerBody()?.prop, 'undefined'), 'undefined')",
                    "prop": "@triggerBody()?.prop"
                },
                "statusCode": 200
            },
            "runAfter": {},
            "type": "Response"
        }
    },
    "contentVersion": "1.0.0.0",
    "outputs": {},
    "parameters": {},
    "triggers": {
        "request": {
            "inputs": {
                "schema": {}
            },
            "kind": "Http",
            "type": "Request"
        }
    }
}

так что запрос с

{
    "prop": "test"
}

результаты в

{
  "prop": "test",
  "propNull": false
}

тогда как запрос с

{
    "propOther": "test"
}

результаты в

{
  "prop": null,
  "propNull": true
}

Теперь вы можете сделать:

 @equals(triggerBody()['jsonObj']?['someProperty'], null)

Это допустимо и может быть сохранено, но если вы попытаетесь переключиться в основной режим, вы получите ошибку. Можно все еще сохранить, хотя.

Другой вариант - выполнить конкатенацию строк в конструкторе и проверить значение> '' (пробел).

Например, ниже я выполняю итерацию по набору агентов, у которых их электронная почта потенциально NULL, присоединение нулевой строки к пустой строке приводит к пустой строке.

Это дает то преимущество, что работает как в конструкторе, так и в представлении кода.

@concat('', items('iterateAgents')?['email'])

Это в конечном итоге выглядит следующим образом в представлении кода

                "expression": {
                    "and": [
                        {
                            "greater": [
                                "@concat('', items('iterateAgents')?['email'])",
                                "  "
                            ]
                        }
                    ]
                },

В моем случае у меня было три сценария:

  • Когда собственность - это что-то { "MyProperty" : "SomeValue" }
  • Когда свойство равно null { "MyProperty" : null }
  • Когда собственность не передается вообще. { }

Предлагаемые решения для меня не сработали, поэтому я получил эти два простых выражения для трех сценариев:

contains (triggerBody(), 'MyProperty') - Проверяет, существует ли свойство с некоторым значением или значением null coalesce (triggerBody()?['MyProperty'], 'NULL') Использует значение свойства или возвращается к нулевому регистру

Другие вопросы по тегам